poj 1135 Dijskral

来源:互联网 发布:苹果手机查看mac地址 编辑:程序博客网 时间:2024/05/22 00:48

伤不起!!!!!!!!!!!!!!!!!!!!!!!!!!

V1竟然要先赋成1 要不就WA。。。还有这个图是双向的 eg[a][b]=eg[b][a]=t;

题意: 多米诺骨牌 找出最后在哪里倒塌;

题解: 好你妹个DIJKSTRA啊!!坑死我了!!有两种情况,一种是在关键牌倒塌,一种是在两者之

间倒塌,所以,先用dijkstra先算出每点的最短路,再看每条边的时间;取最大;



#include<stdio.h>#include<string.h>#include<stdlib.h>#define INF 100001000int eg[510][510],n;double time1[510];int s[510];void Dijskral(){for(int i=1;i<=n;i++){s[i]=0;time1[i]=eg[1][i];}s[1]=1;for(int i=1;i<n;i++){double min=INF;int u=1;for(int j=1;j<=n;j++){if(!s[j]&&time1[j]<min){min=time1[j];u=j;}}s[u]=1;for(int j=1;j<=n;j++){if(!s[j]&&eg[u][j]+time1[u]<time1[j]){time1[j]=eg[u][j]+time1[u];}}}}int main(){int m,cas=1;while(scanf("%d%d",&n,&m)&&(n||m)){for(int i=0;i<=n;i++){for(int j=0;j<=n;j++){if(i==j)eg[i][j]=0;elseeg[i][j]=INF;}}for(int i=0;i<m;i++){int a,b,t;scanf("%d%d%d",&a,&b,&t);if(eg[a][b]>t)eg[a][b]=eg[b][a]=t;}double MAX_time2=0;double MAX_time1=0;int V1=1,V2=0,V3=0;Dijskral();for(int i=1;i<=n;i++){if(time1[i]>MAX_time1){MAX_time1=time1[i];V1=i;}}double k=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(eg[i][j]<INF&&eg[i][j]){k=((double)(time1[i]+time1[j]+eg[i][j]))/2.0;if(k>MAX_time2){MAX_time2=k;V2=i;V3=j;}}}}printf("System #%d\n",cas++);       if(MAX_time2 > MAX_time1)           printf("The last domino falls after %.1f seconds, between key dominoes %d and %d.\n\n",MAX_time2,V2,V3);       else           printf("The last domino falls after %.1f seconds, at key domino %d.\n\n",MAX_time1,V1);}return 0;}



原创粉丝点击