hdu2680最短路Choose the best route

来源:互联网 发布:进销存软件免费下载 编辑:程序博客网 时间:2024/05/16 11:09

hdu2680Choose the best route

 

先将多个起点用一个超级源点连接 ,权值为0

然后用dijkstra就可以得到结果了

 

 

#include<iostream>using namespace std;#define INF 100000000int mp[1010][1010],dist[1010];bool visit[1010];int main(){int N,M,S,T,x,y,c,i,j;while(scanf("%d%d%d",&N,&M,&T)!=EOF){for(i=0;i<=N;i++)for(j=0;j<=N;j++)mp[i][j]=INF;for(i=1;i<=M;i++){scanf("%d%d%d",&x,&y,&c);if(mp[x][y]>c)                    //有多种情况 mp[x][y]=c;}int w;scanf("%d",&w);                       //w个起点sfor(i=1;i<=w;i++){scanf("%d",&S);mp[0][S]=0;}memset(visit,0,sizeof(visit)); visit[0]=1;for(i=0;i<=N;i++)dist[i]=mp[0][i];dist[0]=0;//for(i=0;i<=N;i++)//printf("dist[%d]=%d ",i,dist[i]);//printf("\n");int min,k=0;for(i=0;i<=N;i++){//printf("!N=%d\n",N);min=INF;for(j=0;j<=N;j++)if(!visit[j]&&min>dist[j]){min=dist[j];k=j;}//printf("k=%d    ",k);visit[k]=1;//for(j=0;j<=N;j++) printf("%d ",visit[j]); printf("\n");for(j=0;j<=N;j++)if(!visit[j]&&dist[j]>dist[k]+mp[k][j])dist[j]=dist[k]+mp[k][j];//for(j=0;j<=N;j++)//printf("dist[%d]=%d ",j,dist[j]);//printf("\n");}//for(i=0;i<=N;i++)//printf("dist[%d]=%d ",i,dist[i]);//printf("\n");if(dist[T]==INF)printf("-1\n");else printf("%d\n",dist[T]);}return 0;}


 

 

本来写的是floyd,这题超时

代码如下

//floyd超时 #include<iostream>using namespace std;#define INF 100000000int N,M,S,T;int mp[1010][1010];int main(){int i,j,k,x,y,c,w,min;while(scanf("%d%d%d",&N,&M,&T)!=EOF){for(i=1;i<=N;i++)for(j=1;j<=N;j++)mp[i][j]=INF;for(i=1;i<=M;i++){scanf("%d%d%d",&x,&y,&c);if(mp[x][y]>c)mp[x][y]=c;}//printf("%d %d %d \n",mp[1][4],mp[2][4],mp[3][4]);for(i=1;i<=N;i++)for(j=1;j<=N;j++)for(k=1;k<=N;k++){if(mp[i][j]>mp[i][k]+mp[k][j])mp[i][j]=mp[i][k]+mp[k][j];}scanf("%d",&w);min=INF;for(i=1;i<=w;i++){scanf("%d",&S); if(min>mp[S][T])min=mp[S][T];}if(min>=INF)printf("-1\n");elseprintf("%d\n",min);}return 0;}


 

原创粉丝点击