HDU - 2066 一个人的旅行

来源:互联网 发布:魏延被谁杀 知乎 编辑:程序博客网 时间:2024/06/04 18:00

题目大意:中文题

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

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define INF 0x3f3f3f3f#define N 1010int 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;}
0 0
原创粉丝点击