http://acm.nyist.net/JudgeOnline/problem.php?pid=115
dijstra算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
思路:以叛乱城市为起点,寻找最短的驻部队城市
#include<stdio.h> #include<string.h> #define INT_MAX 1<<29 int map[1005][1005]; int m,n,s[105]; int dijstra(int beg) { bool flag[1005]; int path[1005]; int min,x,i; for(i=1;i<=m;i++) { flag[i]=true; path[i]=INT_MAX; } flag[beg]=false; path[beg]=0; x=m-1; while(x--) { for(i=1;i<=m;i++) if(map[i][beg]) { if(path[i]>map[i][beg]+path[beg]) path[i]=map[i][beg]+path[beg]; } min=INT_MAX; for(i=1;i<=m;i++) { if(min>path[i]&&flag[i]) { min=path[i]; beg=i; } } flag[beg]=false; } min=INT_MAX; for(i=1;i<=n;i++) { if(min>path[s[i]]) min=path[s[i]]; } return min; } int main() { int t,p,q,i,j,a,b,c,min; scanf("%d",&t); while(t--) { memset(map,0,sizeof(map)); scanf("%d%d%d%d",&n,&m,&p,&q); for(i=1;i<=n;i++) scanf("%d",&s[i]); while(p--) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]) map[a][b]=map[b][a]>c?c:map[a][b]; else map[a][b]=map[b][a]=c; } printf("%d\n",dijstra(q)); } return 0; }