#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 1002
int T,S,D;
int Map[MAXN][MAXN];
void InitMap(){
for(int i = 0; i <= 1000; i++){
Map[i][i] = 0;
for(int j = i+1; j <= 1000; j++)
Map[i][j] = Map[j][i] = INF;
}
}
int dis[MAXN],vis[MAXN];
void Dijstra()
{
int mindis,u;
for(int i = 0; i <= 1000; i++)
{
vis[i] = 0;
dis[i] = Map[0][i];
}
vis[0] = 1;
for(int i = 0; i <= 1000; i++)
{
mindis = INF;
for(int j = 0; j <= 1000; j++)
{
if(vis[j]==0 && dis[j]<mindis)
{
mindis = dis[j];
u = j;
}
}
vis[u] = 1;
for(int j = 0; j <= 1000; j++)
{
if(vis[j]==0)
{
if(dis[u]+Map[u][j] < dis[j])
dis[j] = dis[u]+Map[u][j];
}
}
}
}
int main()
{
while(~scanf("%d%d%d",&T,&S,&D))
{
int a,b,dist;
InitMap();
for(int i = 0; i < T; i++)
{
scanf("%d%d%d",&a,&b,&dist);
if(dist < Map[a][b]) ///a与b间可能存在多条道路,取距离最短的一条
Map[a][b] = Map[b][a] = dist;
}
for(int i = 0; i < S; i++)
{
scanf("%d",&a); ///这些城市与草儿家相邻,置其距离为0
Map[a][0] = Map[0][a] = 0;
}
Dijstra();
int MIN = INF;
for(int i = 0; i < D; i++) ///求解答案。
{
scanf("%d",&b);
if(dis[b]<MIN)
MIN = dis[b];
}
printf("%d\n",MIN);
}
return 0;
}
备注:主要利用dijstra算法,多起点多终点问题,可将距离草儿家附近的点的距离置为0.
[题目链接]https://acm.hdu.edu.cn/showproblem.php?pid=2066