hdu5137 How Many Maos Does the Guanxi Worth

来源:互联网 发布:棋牌游戏源码作弊 编辑:程序博客网 时间:2024/06/01 15:32
#include <stdio.h>
#include <string.h>
#include <cstdio>
#include <algorithm>


using namespace std;


const int INF = 1 << 27;
const int N = 1005;


int path[N][N], path0[N][N];
int m, n;


int Min(int a, int b)
{
    return a > b ? b : a;
}


int floyd(int k)
{
    int i, j;
    for(i = 1; i <= n; i ++)
        for(j = 1; j <= n; j ++)
        {
            if(i == k || j == k) path[i][j] = INF;
            else path[i][j] = path0[i][j];
        }
    for(k = 1; k <= n; k ++)
        for(i = 1; i <= n; i ++)
            for(j = 1; j <= n; j ++)
                path[i][j] = Min(path[i][k] + path[k][j], path[i][j]);
    return path[1][n];
}


int main()
{
 //   freopen("in.txt", "r", stdin);
    int i, j, A, B, C, st, ed, maxx, num;
    while(~scanf("%d%d", &n, &m) && (n || m))
    {
        maxx = 0;
        for(i = 1; i <= n; i ++)
            for(j = 1; j <= n; j ++)
            {
                if(i == j) path0[i][j] = path0[i][j] = 0;
                else path0[i][j] = path0[j][i] = INF;
            }
        for(i = 1; i <= m; i ++)
        {
            scanf("%d%d%d", &A, &B, &C);
            if(path0[A][B] > C) path0[A][B] = path0[B][A] = C;
        }
        for(i = 2; i < n; i ++)
        {
            num = floyd(i);
            if(maxx < num) maxx = num;
        }
        if(maxx == INF) printf("Inf\n");
        else printf("%d\n", maxx);
    }
    return 0;

}

心得:弗洛伊德变形,注意寻找最大权值时记得添一个不变的中介矩阵,否则每一次遍历会在上一次的基础上。

0 0