记录编号 |
526821 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[USACO Mar08] 牛跑步 |
最终得分 |
100 |
用户昵称 |
Hale |
是否通过 |
通过 |
代码语言 |
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;
}