HDU 2066(dijkstra算法模板题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066
标准最短路径问题,起点可以看作是草儿家,从草儿家到与家相连的地方time=0,dijkstra求最短路径,然后找出想去地方的最小代价就行了,经典模板题,但是WA了好几次,开始找不出错误,后来发现体重有句话:(1=<(a,b)<=1000;a,b 之间可能有多条路),瞬时明白了,两点之间可以有多条路径的。
当然我的代码中,dijkstra 中的 n有些大了,我们可以在主函数中记录下u,v的最大值作为n就够了,不必每次都遍历完
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define INF 100000000 5 #define n 1000 6 7 using namespace std; 8 int map[1100][1100],dis[1100],flag[1100]; 9 int T,S,D; 10 void dijkstra() 11 { 12 int i,j,k,min; 13 memset(flag,0,sizeof(flag)); 14 flag[0]=1; 15 for(i=0;i<=n;i++) 16 { 17 dis[i]=map[0][i]; 18 } 19 for(i=1;i<n;i++) 20 { 21 min=INF; 22 for(j=1;j<=n;j++) 23 { 24 if(!flag[j]&&dis[j]<min) 25 { 26 min=dis[j]; 27 k=j; 28 } 29 } 30 flag[k]=1; 31 for(j=1;j<=n;j++) 32 { 33 if(!flag[j]&&dis[j]>dis[k]+map[k][j]) 34 dis[j]=dis[k]+map[k][j]; 35 } 36 } 37 } 38 int main() 39 { 40 int u,v,w,x,y,min; 41 while(scanf("%d%d%d",&T,&S,&D)!=EOF) 42 { 43 for(int i=0;i<1010;i++) 44 for(int j=0;j<1010;j++) 45 map[i][j]=INF; 46 for(int i=1;i<=T;i++) 47 { 48 scanf("%d%d%d",&u,&v,&w); 49 map[u][v]=map[u][v]>w?w:map[u][v]; //可能两点之间有多条路径 50 map[v][u]=map[u][v]; 51 } 52 for(int i=1;i<=S;i++) 53 { 54 scanf("%d",&x); 55 map[0][x]=0; 56 map[x][0]=0; 57 } 58 dijkstra(); 59 min=INF; 60 for(int i=0;i<D;i++) 61 { 62 scanf("%d",&y); 63 if(min>dis[y]) min=dis[y]; 64 } 65 printf("%d\n",min); 66 } 67 return 0; 68 }