您的位置:首页 > 其它

HDU - 2066 一个人的旅行

2015-07-31 23:14 197 查看
题目大意:中文题

解题思路:多源点,任意终点,最短路的变形,用dijkstra或者SPFA都可以,只要把源点设置为多个就可以

任意终点的,那就取每个终点的最小值就可以了

[code]#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define N 1010

int dis

, d
;
int T, S, D, Max;
bool vis
;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: