POJ3268Silver Cow Party

来源:互联网 发布:淘宝客推广招聘 编辑:程序博客网 时间:2024/05/21 06:20

题意:给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,从这些最短时间里找出一个最大值输出
用dijkstra求一次从x出发到所有点的最短距离,然后将所有边反向再求一次从x出发到所有点距离,相加求最大。

#include<iostream>#include<stdio.h>#include<cstring>#include<algorithm>#include<map>#include<vector>#include<queue>#include<cmath>#include<functional>using namespace std;#define N 1000+5#define MAXN 1000000#define mem(arr,a) memset(arr,a,sizeof(arr))#define INF 0x3f3f3f3f#define LL long long int #define pow(a) (a)*(a)int d[2][N];int cost[N][N];int vis[N];int n, m, x;void dijkstra(int s,int flag){    mem(d[flag], INF);    mem(vis, 0);    d[flag][s] = 0;    while (1){        int v = -1;        for (int i = 1; i <= n; i++){            if (!vis[i] && (v == -1 || d[flag][i] < d[flag][v]))v = i;        }        if (v == -1)break;        vis[v] = 1;        for (int i = 1; i <= n; i++){            d[flag][i] = min(d[flag][v] + cost[v][i], d[flag][i]);        }    }}int main(){    cin >> n >> m >> x;    mem(cost, INF);    for (int i = 1; i <= m; i++){        int a, b, c;        cin >> a >> b >> c;        cost[a][b] = c;    }    dijkstra(x,0);    for (int i = 1; i <= n; i++){        for (int j = i + 1; j <= n; j++){            swap(cost[i][j], cost[j][i]);        }    }    dijkstra(x, 1);    int MAX = 0;    for (int i = 1; i <= n; i++){        MAX = max(MAX, d[0][i]+d[1][i]);    }    cout << MAX << endl;}
原创粉丝点击