2066
通过代码:
#include<stdio.h>
#define INF 0xfffffff
#define M 1010
int big(int x,int y){
return x>y?x:y;
}
int t[M][M];//两城市距离
int mark[M];//标记城市是否访问
int len[M];//记录从起点到城市i的距离
int ans;
void begen(){
for(int i=0;i<M;i++)//初始路径为INF
for(int j=0;j<M;j++)
t[i][j]=INF;
for(int i=0;i<M;i++){
len[i]=INF;
mark[i]=0;
}
}
void input_time(int T){
int a,b,time;
for(int i=0;i<T;i++){
scanf("%d%d%d",&a,&b,&time);
if(time>t[a][b])
continue;
t[b][a]=t[a][b]=time;
ans=big(ans,big(a,b));
}
}
void city_begen(int S){
int a;
for(int i=0;i<S;i++){
scanf("%d",&a);
len[a]=t[a][0]=t[0][a]=0;//从家到相邻城市的时间修改为0;
}
}
void city_end(int D){
int a;
for(int i=0;i<D;i++){
scanf("%d",&a);
t[a][ans]=t[ans][a]=0;//从目的城市到终点的时间设为0
}
}
int main(){
int T,S,D;
while(~scanf("%d%d%d",&T,&S,&D)){
ans=0;
begen();//初始化数组
input_time(T);
ans++; //最大城市号加1,(假设从要去的城市到ans的时间为0)
city_begen(S); //临近的城市
city_end(D); //要到达的城市
for(int i=1;i<=ans;i++){
int k=0,min=INF;
for(int j=1;j<=ans;j++){
if(mark[j]==0&&len[j]<min){
min=len[j];
k=j;
}
}
if(k==0) // 没找到未标记的城市号,结束
break;
mark[k]=1;//城市k标记为已访问
for(int j=1;j<=ans;j++){
if(mark[j]==0&&len[j]>len[k]+t[k][j])//比较由0到k原时间与由0到k再到j时间的大小
len[j]=len[k]+t[k][j];
}
}
printf("%d\n",len[ans]);
}
return 0;
}