记录编号 526821 评测结果 AAAAAAAAAA
题目名称 [USACO Mar08] 牛跑步 最终得分 100
用户昵称 GravatarHale 是否通过 通过
代码语言 C++ 运行时间 1.254 s
提交时间 2019-01-31 14:40:07 内存使用 4.92 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int INF=0x7fffffff;
const int M=50005;
int m,n,k,p,ans[M],cnt;
int d[M];
bool vis[M];
int read()
{ int x=0,f=1;char ch=getchar();
  while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
  while (ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
  return x*f;
}
struct edge
{ int to,dist;}; vector<edge> g[M],lg[M]; 
struct node
{ int pos;
  int dis;
  bool operator<(const node & x) const 
  { return x.dis<dis;
  }
};
struct headnode
{ int pos;
  int g;
  int step;
  bool operator<(const headnode & x) const 
  { return (x.g==g)?x.step<step:x.g<g;
  }
};
priority_queue<node> que;
priority_queue<headnode> q;
void dijkstra(int s)
{ for (int i=1;i<=n;i++) d[i]=INF;
  d[s]=0;que.push((node){s,0});
  while (!que.empty())
  { node tmp=que.top();que.pop();
    int x=tmp.pos;
    if (vis[x]) continue;
    vis[x]=true;
    for (int i=0;i<lg[x].size();i++)
    { int y=lg[x][i].to,dd=lg[x][i].dist;
      if (d[y]>d[x]+dd) 
      { d[y]=d[x]+dd;
       if (!vis[y]) {que.push((node){y,d[y]});}
     }
    }
  }
}
int shrt[M];
void A_star(int s)
{ memset(ans,-1,sizeof(ans));
  headnode zz,mm;
  zz.g=0;zz.pos=s;zz.step=0;
  q.push(zz);
  while (!q.empty()) 
  { mm=q.top();q.pop();
    int x=mm.pos;
    shrt[x]++;
    if (shrt[x]>k) continue;
    if (x==1)
    { cnt++;
      ans[cnt]=mm.step;
      continue;
    }
    for (int i=0;i<g[x].size();i++)
    { int y=g[x][i].to,dd=g[x][i].dist;
      zz.pos=y;zz.step=mm.step+dd;zz.g=zz.step+d[y];
      q.push(zz);
    }
  }
}
int main()
{ freopen("cowjog.in","r",stdin);
  freopen("cowjog.out","w",stdout);
  n=read();m=read();k=read();
  for (int i=1;i<=m;i++)
  { int x,y,z;
    x=read();y=read();z=read();
    g[x].push_back((edge){y,z});
    lg[y].push_back((edge){x,z});
  }
  dijkstra(1);
  A_star(n);
  for (int i=1;i<=k;i++)
  printf("%d\n",ans[i]);
  return 0;
}