码迷,mamicode.com
首页 > 其他好文 > 详细

HDU - 2066 一个人的旅行

时间:2015-08-01 01:14:43      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:中文题

解题思路:多源点,任意终点,最短路的变形,用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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU - 2066 一个人的旅行

标签:

原文地址:http://blog.csdn.net/l123012013048/article/details/47177463

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!