UVALive 7079 - How Many Maos Does the Guanxi Worth(最短路Floyd)

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5091

题目大意:n个人编号从1到n,m条关系,a找b帮忙或b找a帮忙需要花费c元,当然a可以通过d找b帮忙(即a找d帮忙,d再找b帮忙)

现在1号要找n号帮忙,你需要去找1号和n号之外的人,让他不帮忙,即破坏这条关系链,如果1号最终能找n号b帮忙则输出过程中所

用的最大花费,否则输出Inf

分析:

转化为最短路问题:a到b的花费当做a点到b点的距离

破坏关系链只需在2—n-1号这n-3点中依次找每一个点,将该点到其他点和其他点到该点的距离令为INF,然后找一个1到n的最小距离,

得到n-3个距离,输出这n-3个距离中最大的距离

 

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>

using namespace std;

const int N = 40;
const int INF = 0x3f3f3f3f;

int G[N][N], maps[N][N];
int n;

void Init()
{
    int i, j;
    for(i = 1 ; i <= n ; i++)
    {
        for(j = 1 ; j <= n ; j++)
        {
            if(i == j)
                G[i][j] = 0;
            else
                G[i][j] = G[j][i] = INF;
        }
    }
}

int Floyd(int m)
{
    int i, j, k;
    for(i = 1 ; i <= n ; i++)
    {
        for(j = 1 ; j <= n; j++)
        {
            if(i == m || j == m)
                maps[i][j] = maps[j][i] = INF;//让编号为m的人不帮,来破坏该条关系链
            else
                maps[i][j] = maps[j][i] = G[i][j];
        }
    }
    for(k = 1 ; k <= n ; k++)
    {
        for(i = 1 ; i <= n ; i++)
        {
            for(j = 1 ; j <= n ; j++)
            {
                if(maps[i][j] > maps[i][k] + maps[k][j])
                    maps[i][j] = maps[i][k] + maps[k][j];
            }
        }
    }
    return maps[1][n];
}

int main()
{
    int m, i, a, b, c;
    while(scanf("%d%d", &n, &m), m + n)
    {
        Init();
        while(m--)
        {
            scanf("%d%d%d", &a, &b, &c);
            G[b][a] = G[a][b] = c;
        }
        int ans = 0;
        for(i = 2 ; i <= n - 1 ; i++)
            ans = max(ans, Floyd(i));
        if(ans == INF)
            printf("Inf\n");
        else
            printf("%d\n", ans);
    }
    return 0;
}

 

posted @ 2015-10-10 17:08  午夜阳光~  阅读(202)  评论(0编辑  收藏  举报