建立一个到各个起点权重为0的新起点,用一次dijkstra
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N = 1000005;
int u, v, w, len, head[N], d[N], t, s, en, start[N], ed[N];
bool vis[N];
struct edge{
int v, w, next;
}e[N];
struct node {
int d, v;
node(int d, int v): d(d), v(v) {
}
bool operator < (const node &W)const {
return d > W.d;
}
};
void add(int u, int v, int w) {
e[len].v = v;
e[len].w = w;
e[len].next = head[u];
head[u] = len++;
}
void dijkstra() {
memset(d, 0x3f, sizeof(d));
memset(vis, false, sizeof(vis));
d[0] = 0;
priority_queue<node> q;
q.push(node(0, 0));
while(!q.empty()) {
int u = q.top().v;
q.pop();
if(vis[u]) continue;
vis[u] = true;
for(int j = head[u]; j != -1; j = e[j].next) {
int v = e[j].v;
int w = e[j].w;
if(!vis[v] && d[v] > d[u] + w) {
d[v] = d[u] + w;
q.push(node(d[v], v));
}
}
}
}
int main() {
while(scanf("%d%d%d", &t, &s, &en) != EOF) {
memset(head, -1, sizeof(head));
len = 0;
for(int i = 1; i <= t; i++) {
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
add(v, u, w);
}
for(int i = 1; i <= s; i++) {
scanf("%d", &start[i]);
add(0, start[i], 0);//增加一个起点
add(start[i], 0, 0);
}
for(int i = 1; i <= en; i++) {
scanf("%d", &ed[i]);
}
int ans = 0x7f7f7f7f;
dijkstra();
for(int i = 1; i <= en; i++) {
ans = min(ans, d[ed[i]]);
}
printf("%d\n", ans);
}
return 0;
}