@tenlee
2015-08-09T11:58:43.000000Z
字数 1011
阅读 2026
HDUOJ
略
略
//Author LJH//www.cnblogs.com/tenlee#include <cstdio>#include <cstdlib>#include <cstring>#include <cctype>#include <cmath>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <map>#define clc(a, b) memset(a, b, sizeof(a))#define LL long longusing namespace std;const int inf = 0x3f;const int INF = 0x3f3f3f3f;const int maxn = 1e3+5;int g[maxn][maxn], dis[maxn];bool vis[maxn];int T, S, D, n;void Dijkstra(){clc(dis, INF);clc(vis, 0);dis[0] = 0;for(int i = 0; i <= n; i++){int mark = -1, mindis = INF;for(int j = 0; j <= n; j++){if(!vis[j] && dis[j] < mindis){mindis = dis[j];mark = j;}}vis[mark] = 1;for(int j = 0; j <= n; j++){if(!vis[j]){dis[j] = min(dis[j], dis[mark]+g[mark][j]);}}}}int main(){int a, b, c;while(~scanf("%d %d %d", &T, &S, &D)){clc(g, INF);for(int i = 0; i < T; i++){scanf("%d %d %d", &a, &b, &c);g[a][b] = g[b][a] = g[a][b] < c ? g[a][b] : c;n = max(a, n);n = max(b, n);}for(int i = 0; i < S; i++){scanf("%d", &a);g[0][a] = g[a][0] = 0; //增加源点}n++;for(int i = 0; i < D; i++){scanf("%d", &a);g[a][n] = g[n][a] = 0; //增加汇点}Dijkstra();printf("%d\n", dis[n]);}return 0;}