P1743 Audiophobia

该博客主要讨论如何解决寻找两点间噪声值最大但总体噪声值最小的路径问题。给出的算法题要求在无向带权图中,针对多个询问,找到每对点之间最大噪声值最小的路径上噪声值的最大值。如果两点不连通,则输出'no path'。题目描述了输入输出格式,并提供了样例输入和输出。

题目描述

输入一个C 个点 S 条边的无向带权图,边权表示该路径上的噪声值。当噪声值太大时,耳膜可能会受到伤害,所以当你从某点去往另一个点时,总是希望路上经过的最大噪声值最小。输入一些询问,每次询问两个点,输出这两个点间「最大噪声值最小的路径」上,噪声值最大的一条边的噪声值。

如果两个点之间不连通,输出 "no path"。(不含引号)

输入描述

本题包含多组输入。

每组数据第一行含有 3 个整数:C,S,Q,分别表示点数、边数和询问数量。

接下来 S 行,每行三个整数 u,v,w,表示一条两端点为 u,v,噪声值为 w 的无向边。

之后的 Q 行,每行两个整数 a,b,询问从 a 到 b,「最大噪声值最小的路径」的「最大噪声值」。

(C≤100,S≤1000,Q≤10000 )

输出描述

每组数据输出的起始部分,输出一行数据编号 (从 1 开始计数)。

对每次询问,若两点连通,输出两点间「最大噪声值最小的路径」的「最大噪声值」。否则输出 "no path"。

详见样例。

样例输入

Copy to Clipboard
6 6 1 5 1 5 6 1 4 2 1 3 3 6 7 3 4 6 3 1 8 2 5 5 4 2 4 1 9 5 1 4 2 1 3 3 4 7 4 5 4 5 

样例输出

Copy to Clipboard
Case #1 5 Case #2 9 9

/*
 * @Description: To iterate is human, to recurse divine.
 * @Autor: Recursion
 * @Date: 2022-06-08 18:59:29
 * @LastEditTime: 2022-06-08 20:47:14
 */
#include <bits/stdc++.h>
#define LL long long 
using namespace std;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 1e9 + 10;
const int N = 1e3 + 7;
int a[N][N];

int C,S,Q;
int u,v,w;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int count = 0;
    while(cin >> C >> S >> Q){
        count ++;
        memset(a,0,sizeof(a));
        for(int i = 1;i <= C;i ++)
            for(int j = 1;j <= C;j ++)
                if(i != j)
                    a[i][j] = INF;
        while(S--){
            cin >> u >> v >> w;
            a[u][v] = w;
            a[v][u] = w;
        }
        for(int k = 1;k <= C;k ++)
            for(int i = 1;i <= C;i ++)
                    for(int j = 1;j <= C;j ++)
    
                        a[i][j] = min(a[i][j],max(a[i][k],a[k][j]));
        cout << "Case #" << count << endl;
        while(Q--){
            int x,y;
            cin >> x >> y;

            if(a[x][y] == INF){
                cout << "no path" << endl;
                continue;
            }
            else
                cout << a[x][y] << endl;
            }
    }


    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值