zoukankan      html  css  js  c++  java
  • UVALive 7079

    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
    ");
            else
                printf("%d
    ", ans);
        }
        return 0;
    }
  • 相关阅读:
    自定义input标签输入框
    sys.argv 启动时可以传入变量
    falcon 监控
    wrk 压测工具
    mysql UPDATE和REPLACE
    tesseract识别图片中文字
    centos 查看日志 & 查找文件、目录、内容 & centos查看磁盘使用情况
    压力测试
    tensorflow + scikit-learn
    Pycharm快捷键配置
  • 原文地址:https://www.cnblogs.com/qq2424260747/p/4867607.html
Copyright © 2011-2022 走看看