标签:
题目大意:中文题
解题思路:多源点,任意终点,最短路的变形,用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