Problem Description
虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
Input
输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
Output
输出草儿能去某个喜欢的城市的最短时间。
import java.util.Arrays;
import java.util.Scanner;
///caoer guo guo
public class Caoer {
public static void main(String[] args){
Scanner cin=new Scanner(System.in);
while(cin.hasNext()){
int[][] graph=new int[1021][1021]; //存储城市图表
int[] dist=new int[1021]; //存放草儿家的镇到某个城市的距离,假设草儿家在0,城市的区域为1~1000;
boolean[] isV=new boolean[1021]; //判断某个城市是否Isvisit?是否被访问过
int T=cin.nextInt(); //路径数
int S=cin.nextInt(); //草儿家挨着的城市数
int D=cin.nextInt(); //草儿想去的城市数
int numV=1000000;
int[] w=new int[1021]; //存放草儿想去的城市
for(int i=0;i<=1020;i++){ //初始化城市表
for(int j=0;j<=1020;j++)
if(i==j)graph[i][j]=0;
else graph[i][j] =numV ;
}
for(int i=0;i<T;i++){
int a=cin.nextInt();
int b=cin.nextInt();
int c=cin.nextInt();
if(graph[a][b]>c) //城市a和b之间可能有多条路,只存储最短的那条
graph[b][a]=graph[a][b]=c;
}
for(int i=0;i<S;i++){ //假设城市0就是草儿的镇子,那么跟她相邻的城市距离镇子为0;
graph[0][cin.nextInt()]=0; //这样就不必考虑从哪个城市出发了。。
}
for(int i=0;i<D;i++){ //存好草儿想去的城市,方便最后比较一个用时最少的
w[i]=cin.nextInt();
}
for(int i=1;i<=1020;i++){ //初始化草儿镇子离各个城市的距离
dist[i]=graph[0][i];
}
Arrays.fill(isV, false);
isV[0]=true; //最初只有草儿镇子0被访问过
int min=0; //以下是Dijia算法主要步骤
int v=0;
for(int i=0;i<1020;i++){
min=numV;
for(int j=0;j<=1020;j++){
if(isV[j]!=true&&dist[j]<min)
{min=dist[j];
v=j;}
}
isV[v]=true;
for(int j=0;j<=1020;j++){
if(isV[j]!=true&&dist[j]>dist[v]+graph[v][j]){
dist[j]=dist[v]+graph[v][j];
}
}
}
//遍历完之后,取出草儿想去的城市数组, 找到每个城市最少值里最少的那个时间值输出
int inf=1000000;
for(int i=0;i<D;i++){
if(dist[w[i]]<inf)inf=dist[w[i]];
}
System.out.println(inf);
}
}
}