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;
}