uva10048

题目链接请戳 这里

解题思路

用类似于floyd算法解决。

状态转移方程:dp[i][j] = min(dp[i][j], max(dp[i][k], dp[k][j]))

代码

#include<iostream>
#include<algorithm>
using namespace std;

const int N = 110;
const int INF = 1e9 + 1;

int dp[N][N];
int n, m, q;

void floyd()
{
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            //注意要判断i和k之间k和j之间是否有通路,否则求max的时候会把INF也算进去
            for (int j = 1; j <= n; j++) if(dp[i][k] < INF && dp[k][j] < INF){
                int min_num = max(dp[i][k], dp[k][j]);
                dp[i][j] = min(dp[i][j], min_num);
            }
        }
    }
}
int main()
{
    cin >> n >> m >> q;
    int t = 0;
    while (!(n == 0 && m == 0 && q == 0)) {
        t++;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (i != j)
                    dp[i][j] = INF;
                else
                    dp[i][j] = 0;
            }
        }
        for (int i = 0; i < m; i++) {
            int c1, c2, d;
            cin >> c1 >> c2 >> d;
            //注意是无向的,来回都要赋值
            dp[c1][c2] = d;
            dp[c2][c1] = d;
        }
        floyd();
        cout << "Case #" << t << endl;
        for (int i = 0; i < q; i++) {
            int a, b;
            cin >> a >> b;
            if(dp[a][b] < INF)
                cout << dp[a][b] << endl;
            else
                //a和b之间没有通路
                cout << "no path" << endl;
        }
        cin >> n >> m >> q;
        //最后一个测试组不用输出换行
        if (!(n == 0 && m == 0 && q == 0)) cout << endl;
    }
}
时间: 2025-01-06 11:36:37

uva10048的相关文章

UVA10048 - Audiophobia(Floyd,最大值的最小化)

UVA10048 - Audiophobia(Floyd,最大值的最小化) UVA10048 - Audiophobia 题目大意:给定一无向图,每条边都有一个权值,现在给你起点和终点,要求你找出起点到终点途经的边的最大值,要求这个值尽量小,到不了输出no path. 解题思路:在floyd过程中,就可以记录下来.G[i][j] = min(G[i][j], max(G[i][k], G[k][j])); 代码: #include <cstdio> const int maxn = 105;

UVa10048 Audiophobia (Floyd)

链接:http://bak3.vjudge.net/problem/UVA-10048 分析:把Floyd算法里的加法改成max.因为不管是floyd算法还是dijkstra算法,都是基于这样一个事实:对于任意一条至少包含两条边的路径i->j,一定存在一个中间点k,使得i->j的总长度等于i->k与k->j的长度之和.对于不同的点k,i->k和k->j的长度之和可能不同,最后还需要取一个最小值才是i->j的最短路径.把刚才推理中“之和”换成“取最大值”,推理仍然适

汝佳大神的紫书上写错了?uva10048

算法竞赛入门经典第二版的365页例题11-5噪音,应该是"之和"换成"取最大值","取最小值"还是取最小值 如果我错了,请大家务必指点 版权声明:转载务必请标明出处,谢谢

UVA 10048 Audiophobia 【floyd】

题目链接: https://vjudge.net/problem/UVA-10048 中文大意: 现在有一个无向图,有C个点,S个边,Q个询问. 每条边有一个权值代表噪音值.若想从u走到v.选择一条最大噪音尽可能小的路线. 对于每一个询问,输出u到v的路径中,输出路线的最大噪音值是多少. 大致思路: 整体的思路还是floyd,只不过中间的转移方程需要变一下. 原始的floyd是求最短路,更新的时候是当有更短的路径存在. 而在本题中,有更新的条件是发现某个路径上噪音最大值小于当前存储的值时,更新此

9.1总结前日(数学+图论)

后天就要开学了,这应该是这个暑假的最后一次总结了吧. 说实话,忙忙碌碌的一个暑假,学到东西了么?学到了.学了多少?还可以吧hhh. 想起来去年的这个时候,我还抱着紫书在那里看爆搜,啥也看不懂,现在呢,怎么说也懂得了一些吧. 路就是这样,你敢走,就有的走. 狭路相逢,勇者胜. UVA 1645 题意:给出一个数n,求n个结点的树有多少种结构满足每个结点的子结点数相同. 解法:n结点树,除去根结点,有n-1个结点,根结点的每棵子树需要完全相同, 所以根结点的子树个数k,它们满足(n-1)%k==0.