城市平乱 (dijkstra模板题)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=115
本题求单源最短路,这里有个技巧,因为源点不一,这时我们可以设置一个“超级源点”,即数组下标为0的点,这是只要该点到真正源点的距离为0就可以了。
下面是AC代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define INF 1000000000 5 int map[1005][1005],flag[1005],dis[1005]; 6 int n; 7 8 int min(int a,int b) {return a<b?a:b;} 9 void dijkstra() 10 { 11 int i,j,k,m; 12 memset(flag,0,sizeof(flag)); 13 for(i=1;i<=n;i++) 14 dis[i]=map[0][i]; 15 flag[0]=1; 16 dis[0]=0; 17 for(i=1;i<=n;i++) 18 { 19 m=INF; 20 for(j=1;j<=n;j++) 21 { 22 if(!flag[j]&&dis[j]<m) 23 { 24 m=dis[j]; 25 k=j; 26 } 27 } 28 flag[k]=1; 29 for(j=0;j<=n;j++) 30 { 31 if(!flag[j]&&dis[j]>dis[k]+map[k][j]) 32 dis[j]=dis[k]+map[k][j]; 33 } 34 } 35 } 36 int main() 37 { 38 int i,j,T,x,m,p,u,v,w,t; 39 scanf("%d",&T); 40 while(T--) 41 { 42 scanf("%d%d%d%d",&x,&n,&m,&p); 43 for(i=0;i<=n;i++) 44 for(j=0;j<=n;j++) 45 map[i][j]=INF; 46 for(i=1;i<=x;i++) 47 { 48 scanf("%d",&t); 49 map[0][t]=0; 50 map[t][0]=0; 51 } 52 for(i=1;i<=m;i++) 53 { 54 scanf("%d%d%d",&u,&v,&w); 55 map[u][v]=min(map[u][v],w); 56 map[v][u]=map[u][v]; 57 } 58 dijkstra(); 59 printf("%d\n",dis[p]); 60 } 61 return 0; 62 }