POJ 3268 sliver cow party

来源:互联网 发布:餐饮订餐软件 编辑:程序博客网 时间:2024/05/19 22:24

题目:
这里写图片描述

奶牛们分别从n个农场前往x地开派对,有m条路线把n个农场相连,路是单向的。
奶牛们从所在的地方用最短路径走到x,再用最短的路径走回来。求出路径最长的奶牛要花费多长时间。
第一行输入n,m,x。随后的m+1行输入a,b,t。从a地到b地花费时间t。
思路:
确定了x点,单源最短路问题。首先用dijkstra算法,把x点到其他所有点的最短距离存储在数组中。然后把所有的路反转一下,再用dijkstra算法,把x点到其他所有点的最短距离存储在数组中,此时这个数组代表的是其他点到x点的最短距离。再加一下,找到最大的,结束。
AC情况:
这里写图片描述
代码:

#include<iostream>#include<algorithm>using namespace std;#define maxn 1005#define INF 0x3f3f3f3fint i, j;int map[maxn][maxn], n;int d[maxn], d2[maxn];void dijkstra(int x) {    int visit[maxn],i,j,min,next=x;    memset(visit, 0, sizeof(visit));    for (i = 1; i <= n; i++)        d[i] = map[x][i];    visit[x] = 1;    for (i = 2; i <= n; i++) {        min = INF;        for (j = 1; j <= n; j++) {            if (!visit[j] && d[j] < min) {                min = d[j];                next = j;            }        }        visit[next] = 1;        for (j = 1; j <= n; j++) {            if (!visit[j] && d[j] > d[next] + map[next][j])                d[j] = d[next] + map[next][j];        }    }}int main() {    int m, x;    int a, b, t;    scanf_s("%d%d%d", &n, &m, &x);    for (i = 1; i <= n; i++) {        for (j = 1; j <= n; j++) {            if (i == j) map[i][j] = 0;            else map[i][j] = INF;        }    }    while (m--) {        scanf_s("%d%d%d", &a, &b, &t);        map[a][b] = t;    }    dijkstra(x);    for (i = 1; i <= n; i++)        d2[i] = d[i];                     //d2[i]表示x到点i的最短路    for (i = 1; i <= n; i++) {        for (j = i + 1; j <= n; j++) {            int t;            t = map[j][i];            map[j][i] = map[i][j];            map[i][j] = t;        }    }    dijkstra(x);                          //此时 d[i]表示点i到x的最短路    int ans = 0;    for (i = 1; i <= n; i++)        if (i != x) ans = max(ans, d2[i] + d[i]);    printf("%d\n", ans);    return 0;}