POJ

来源:互联网 发布:浙江省人口数据 编辑:程序博客网 时间:2024/06/07 06:06

题目大意:n 个点 m 条边,第二行开始每行三个数 表示 a 到 b 要花费 l 时间,所有奶牛要到 x 的位置去开 party,除了 x 外,别的奶牛去 x 都有一个来回的最短时间,求所有奶牛来回最短时间,并输出最大值
解题思路:有向图,所以来回时间是不同的,将临接矩阵行列对换,进行两次dijkstra即可

#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string.h>#include<string>#include<queue>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))const int INF = 0x3f3f3f3f;const int NINF = -INF -1;const int MAXN = 1e3+5;using namespace std;int n, m, x;int map[MAXN][MAXN];int dis[MAXN], d[MAXN];bool vis[MAXN];int dijkstra() {    for (int i = 1; i <= n; i++) {        dis[i] = map[x][i];        d[i] = map[i][x];    }    for (int i = 1; i <= n; i++) {        int v, minn = INF;        for (int j = 1; j <= n; j++)            if (!vis[j] && dis[j] < minn) {                minn = dis[j];                v = j;            }        vis[v] = true;        for (int j = 1; j <= n; j++)            if (!vis[j] && dis[j] > map[v][j] + dis[v])                dis[j] = map[v][j] + dis[v];    }    memset(vis, 0, sizeof(vis));    for (int i = 1; i <= n; i++) {        int v, minn = INF;        for (int j = 1; j <= n; j++)            if (!vis[j] && d[j] < minn) {                minn = d[j];                v = j;            }        vis[v] = true;        for (int j = 1; j <= n; j++)            if (!vis[j] && d[j] > map[j][v] + d[v])                d[j] = map[j][v] + d[v];    }    int maxx = -1;    for (int i = 1; i <= n; i++)        if (d[i] + dis[i] > maxx)            maxx = d[i] + dis[i];    return maxx;}int main() {    while (scanf("%d%d%d", &n, &m, &x) != EOF) {        memset(vis, 0, sizeof(vis));        memset(dis, 0, sizeof(dis));        for (int i = 0; i <= n; i++)            for (int j = 0; j <= n; j++)                if (i == j) map[i][j] = 0;                else map[i][j] = INF;        for (int i = 0; i < m; i++) {            int a, b, l;            scanf("%d%d%d", &a, &b, &l);            map[a][b] = l;        }        printf("%d\n", dijkstra());    }    return 0;}
原创粉丝点击