题目链接:点击打开链接
直接进行一次Dijkstra就行了
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define M 0x3f3f3f3f
#define N 1010
using namespace std;
int map[N][N];
int dist[N], pre[N];
bool vis[N];
int t, s, d;
int a, b, tim;
int nn, minn;
void Dijkstra(int v0)
{
for(int i = 1; i <= nn; i++)
{
dist[i] = map[v0][i];
vis[i] = false;
if(dist[i] == M)
{
pre[i] = -1;
}
else
{
pre[i] = v0;
}
}
dist[v0] = 0;
vis[v0] = true;
for(int i = 2; i <= nn; i++)
{
minn = M;
int pos = v0;
for(int j = 1; j <= nn; j++)
{
if(!vis[j] && dist[j] < minn)
{
minn = dist[j];
pos = j;
}
}
vis[pos] = true;
for(int j = 1;j <= nn; j++)
{
if(!vis[j] && map[pos][j] < M)
{
if(dist[pos] + map[pos][j] < dist[j])
{
dist[j] = dist[pos] + map[pos][j];
pre[j] = pos;
}
}
}
}
}
int main()
{
while(~scanf("%d%d%d", &t, &s, &d))
{
nn = 0;
memset(map, M, sizeof(map));
for(int i = 0; i < t; i++)
{
scanf("%d%d%d", &a, &b, &tim);
nn = max(nn, max(a, b));
map[a][b] = map[b][a] = min(tim, map[a][b]);
}
for(int i = 0; i < s; i++)
{
scanf("%d", &a);
map[0][a] = 0;
}
int m = M;
Dijkstra(0);
for(int i = 0; i < d; i++)
{
scanf("%d", &a);
m = min(m, dist[a]);
}
printf("%d\n", m);
}
return 0;
}