Problem : 2066 ( 一个人的旅行 ) Judge Status : Accepted
RunId : 2839037 Language : G++ Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
RunId : 2839037 Language : G++ Author : huwenbiao
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
/***************************************************************\
*Author:Hu Wenbiao
*Created Time: Wed 18 Aug 2010 05:49:24 PM CST
*File Name: main.cpp
*Description:单源最短路径。增加一个总出发点和一个总目的地转化为
*一般的单源最短路径
\***************************************************************/
//*========================*Head File*========================*\\
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*----------------------*Global Variable*----------------------*/
int T,S,D,N,a,b,_time,G[1010][1010],Dest[1010],dist[1010];
bool visit[1010];
//*=======================*Main Program*=======================*//
using namespace std;
int main(){
//freopen("input","r",stdin);
while(scanf("%d%d%d",&T,&S,&D)!=EOF){
memset(G,100,sizeof(G));//初始化为一个较大值
N=0;//N标记最大的顶点值
for(int i=0;i<T;i++){
scanf("%d%d%d",&a,&b,&_time);
if(a>N)N=a;
if(b>N)N=b;
if(G[a][b]>_time)//取最短路径
G[a][b]=G[b][a]=_time;
}
for(int i=1;i<=S;i++){//将0作为总出发点,它到各个实际出发点的距离为0
scanf("%d",&a);
if(a>N)N=a;
G[0][a]=G[a][0]=0;
}
for(int i=1;i<=D;i++){//N+1作为总目的地,这时还未确定下来
scanf("%d",Dest+i);
if(Dest[i]>N)
N=Dest[i];
}
N++;
for(int i=1;i<=D;i++)//各目的地到总目的地的距离是0
G[N][Dest[i]]=G[Dest[i]][N]=0;
for(int i=1;i<=N;i++){
dist[i]=G[0][i];
}
memset(visit,false,sizeof(visit));
visit[0]=1;
while(true){
int u,_min=1000000000;
for(int i=1;i<=N;i++){
if(!visit[i]&&dist[i]<_min){
u=i;
_min=dist[i];
}
}
visit[u]=true;
if(u==N)break;
for(int i=1;i<=N;i++){
if(!visit[i]&&dist[i]>_min+G[u][i])
dist[i]=_min+G[u][i];
}
}
printf("%d\n",dist[N]);
}
}