HDU 2145 (A strange lift) 最短路(Dijkstra)

来源:互联网 发布:bat程序员工资 编辑:程序博客网 时间:2024/04/28 01:51
微笑没什么可以注意的就是终点当成起点,注意floyd会超时,因为我一开始就是用floyd写的但我不知道为毛300*300*300会超时。

还有一点要注意的就是结构题快排的cmp函数的内部结构。

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#define inf 0x7ffffffusing namespace std;const int N=300+5;int map[N][N],p[N],spd[N];int n,m,k;int vis[N],dis[N];struct node{double tim;int len;int id;}V[N];bool cmp(node a,node b){if(a.tim==b.tim){if(a.len==b.len){return a.id>b.id;}else return a.len>b.len;}else return a.tim<b.tim;}void dijkstra(int ed){memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){dis[i]=map[ed][i];}vis[ed]=1;dis[ed]=0;for(int i=2;i<=n;i++){int temp;int Min=inf;for(int j=1;j<=n;j++){if(!vis[j]&&Min>dis[j]){temp=j;Min=dis[j];}}if(Min==inf) break;vis[temp]=1;for(int j=1;j<=n;j++){if(!vis[j]&&map[temp][j]<inf){if(dis[j]>dis[temp]+map[temp][j]){dis[j]=dis[temp]+map[temp][j];}}}}}int main(){while(~scanf("%d%d%d",&n,&m,&k)){int ed;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j) map[i][j]=0;else map[i][j]=inf;}}for(int i=1;i<=k;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);if(w<map[v][u]){map[v][u]=w;}}scanf("%d",&ed);dijkstra(ed);for(int i=1;i<=m;i++){scanf("%d",&p[i]);}for(int i=1;i<=m;i++){scanf("%d",&spd[i]);}for(int i=1;i<=m;i++){if(dis[p[i]]>=inf){V[i].tim=inf;V[i].len=inf;V[i].id=i;}else{V[i].tim=dis[p[i]]*1.0/spd[i];V[i].len=dis[p[i]];V[i].id=i;}}sort(V+1,V+1+m,cmp);if(V[1].tim==inf) printf("No one\n");else printf("%d\n",V[1].id);}return 0;}


0 0
原创粉丝点击