一个人的旅行
题目链接: 传送门一定要看我的代码注释,最短路径满满的都是坑。
//以下注释的几点很容易出错。
#include<stdio.h>
#define N 1005
#define MAX 1000000000
int map[N][N],dis[N],vi[N];
int home[N],end[N];
void Dj(int n,int x)
{
for(int i=0;i<n;i++)
{
dis[i]=map[x][i];
vi[i]=0;
}
vi[x]=1;
dis[x]=0;//这个题目还可以再坑一点,就是相邻城市与目的城市是一个城市的时候。
for(int i=1;i<n;i++)
{
int min=MAX;
int p;
for(int j=1;j<n;j++)
{
if(!vi[j] && dis[j]<min)
{
min=dis[j];
p=j;
}
}
vi[p]=1;
for(int j=1;j<n;j++)
{
if(!vi[j] && dis[p]+map[p][j]<dis[j])
dis[j]=dis[p]+map[p][j];
}
}
}
int main()
{
int T,S,D;
int x,y,d;
int mm;
int n;
while(~scanf("%d%d%d",&T,&S,&D))
{
mm=MAX;
n=0;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
map[i][j]=MAX;
for(int i=0;i<T;i++)
{
scanf("%d%d%d",&x,&y,&d);
if(d<map[x][y]) //如果不加此判断一定WA;
map[x][y]=map[y][x]=d;
if(x<y) //如果不记录最小值n就会RUN_TIME
x=y;
if(n<x)
n=x;
}
for(int i=0;i<S;i++)
{
scanf("%d",&home[i]);
map[0][home[i]]=map[home[i]][0]=0;
}
for(int i=0;i<D;i++)
scanf("%d",&end[i]);
Dj(n+1,0);
for(int j=0;j<D;j++)
{
if(dis[end[j]]<mm)
mm=dis[end[j]];
}
printf("%d\n",mm);
}
return 0;
}