我是这样理解的:floyd找每两点之间最短路,最后在有所有有hotel的节点中,找出w[i][i]最小的一个。。。。。
需要注意的是,在初始化中,w[i][i]应初始化为无穷大,即认为city和原city间无路(因为要出去)。
恩,还是一道floyd的水题。。。不过我现在只能刷水题了。。。。
#include<stdio.h>
#include<string.h>
#define INF 1000000
int w[101][101],hotel[101];
int main()
{
int i,j,k,ww,u,v,path,city,hot,min;
memset(hotel,0,sizeof(hotel));
while(scanf("%d%d",&city,&hot)!=EOF)
{
for(i=1;i<=city;i++)
{
for(j=1;j<=city;j++)
w[i][j]=INF;
}
for(i=0;i<hot;i++)
scanf("%d",&hotel[i]);
scanf("%d",&path);
for(i=0;i<path;i++)
{
scanf("%d%d%d",&u,&v,&ww);
w[u][v]=ww;
}
for(k=1;k<=city;k++)
for(i=1;i<=city;i++)
for(j=1;j<=city;j++)
/*if(w[i][j]<INF&&w[k][j]<INF)*/
if(w[i][j]>w[i][k]+w[k][j])
w[i][j]=w[i][k]+w[k][j];
min=INF;
for(i=0;i<hot;i++)
{
k=hotel[i];
if(w[k][k]<min)
{
min=w[k][k];
j=k;
}
}
if(min==INF)
printf("I will nerver go to that city!\n");
else
printf("%d\n",j);
}
return 0;
}