#include "stdio.h"
#include "cstring"
#include "vector"
#include "queue"
#define INF 0x3f3f3f3f;
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b
int d[1005];
int cost[1005][1005];
int used[1005];
int n;
void dijkstra(int s){
d[s] = 0;
while(true){
int v = -1;
for (int u = 0; u <= n; u++){
if (!used[u] && (v == -1 || d[u] < d[v])) v = u;
}
if (v == -1) break;
used[v] = true;
for(int u = 0; u <= n; u++){
d[u] = min(d[u], d[v] + cost[v][u]);
}
}
}
int main(){
// freopen("data.in","r",stdin);
int T, S, D;
int V;
while (scanf("%d%d%d",&T,&S,&D) != EOF){
memset(cost,0x3f,sizeof(cost));
memset(used,false,sizeof(used));
memset(d,0x3f,sizeof(d));
n = 0;
for (int i = 0; i < 1005; i++)
cost[i][i] = 0;
for (int i = 0; i < T; i++){
int a, b, ct;
scanf("%d%d%d",&a,&b,&ct);
if (ct > cost[a][b] || ct > cost[b][a]) continue;
cost[a][b] = ct;
cost[b][a] = ct;
n = max(max(n, a), b);
}
for (int i = 0; i < S; i++){
int b;
scanf("%d",&b);
cost[0][b] = 0;
}
dijkstra(0);
int mincost = INF;
// printf("%d\n%d\n",d[8],d[9]);
for (int i = 0; i < D; i++){
int temp;
scanf("%d",&temp);
mincost = min(d[temp],mincost);
}
printf("%d\n",mincost);
}
return 0;
}
重点是u是<=n的注意,开始就因为这个不能AC。还有就是要转化成单源路径,将起点为家,邻近的设为0的cost。而且特别是的,在这道题,好像cost[i][i]不设置为0,我感觉问题也不大,不涉及自己的加法。同时,要审题!审题!a到b和b到a都要设置cost。