这题写坑了。。居然写了一个点。。
不久是裸的SPFA么,居然敲屎了!
啥也不说了,贴代码!(AC 15MS)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int INF = 0x7f7f7f;
const int MAX = 1020;
int start[MAX], dis[MAX];
int que[MAX], tail, front, now, size;
bool to[MAX];
struct way{
int to, time;
}tp;
vector<way> adjmap[MAX];
int bfs(int s){
tail = 0, front = 1;
for(int i = 0; i < MAX; ++i)
dis[i] = INF;
que[0] = s, dis[s] = 0;
while(tail < front){
now = que[tail++];
size = adjmap[now].size();
for(int i = 0; i < size; ++i){
tp = adjmap[now][i];
if(dis[tp.to] > dis[now] + tp.time){
dis[tp.to] = dis[now] + tp.time;
que[front++] = tp.to;
}
}
}
int ans = INF;
for(int i = 0; i < MAX; i++)
if(to[i])
ans = min(dis[i], ans);
return ans;
}
int main(){
int t, s, d, a, b, time, temp;
while(~scanf("%d%d%d", &t, &s, &d)){
int ans = INF;
memset(to, false, sizeof(to));
for(int i = 0; i < MAX; ++i)
adjmap[i].clear();
while(t--){
scanf("%d%d%d", &a, &b, &time);
adjmap[a].push_back((way){b, time});
adjmap[b].push_back((way){a, time});
}
for(int i = 0; i < s; ++i)
scanf("%d", start + i);
for(int i = 0; i < d; ++i){
scanf("%d", &temp);
to[temp] = true;
}
for(int i = 0; i < s; ++i)
ans = min(ans, bfs(start[i]));
printf("%d\n", ans);
}
}