标签:
题目大意:中文题
解题思路:多源点,任意终点,最短路的变形,用dijkstra或者SPFA都可以,只要把源点设置为多个就可以
任意终点的,那就取每个终点的最小值就可以了
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define N 1010
int dis[N][N], d[N];
int T, S, D, Max;
bool vis[N];
void init(){
memset(dis, 0x3f, sizeof(dis));
Max = -1;
int x, y, z;
for (int i = 0; i < T; i++) {
scanf("%d%d%d", &x, &y, &z);
if (dis[x][y] > z) {
dis[x][y] = dis[y][x] = z;
}
if (Max < x || Max < y) {
Max = max(x, y);
}
}
}
int Dijkstra() {
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= Max; i++) {
d[i] = INF;
}
int x;
for (int i = 0; i < S; i++) {
scanf("%d", &x);
d[x] = 0;
}
for (int i = 1; i <= Max; i++) {
int x, t = INF;
bool flag = false;
for (int j = 1; j <= Max; j++)
if (t > d[j] && !vis[j]) {
t = d[j];
x = j;
flag = true;
}
if(!flag)
break;
vis[x] = true;
for (int j = 1; j <= Max; j++)
if (d[x] + dis[j][x] < d[j])
d[j] = d[x] + dis[j][x];
}
int ans = INF;
for (int i = 0; i < D; i++) {
scanf("%d", &x);
ans = min(ans, d[x]);
}
return ans;
}
int main() {
while (scanf("%d%d%d", &T, &S, &D) != EOF) {
init();
printf("%d\n",Dijkstra());
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/l123012013048/article/details/47177463