Cow Hurdles

这篇博客介绍了如何运用Floyd算法解决一个关于奶牛跳跃比赛的问题。在这个问题中,奶牛们试图找到从一个站台到另一个站台的路径,使得路径上的最高栏高度最小。博主给出了详细的输入格式、输出格式以及数据规模,并提供了AC代码示例,展示了如何利用动态规划的Floyd算法模板来找出最小最高栏高度。博客还包含了样例输入和输出,帮助读者理解解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

题目描述

约翰想让她的奶牛准备晋级跳跃比赛,贝茜和她的伙伴们正在练习跨栏。她们很累,所以她们想消耗最少的能量来跨栏。

显然,对于一头奶牛跳过几个矮栏是很容易的,但是高栏却很难。于是,奶牛们总是关心路径上最高的栏的高度。

奶牛的训练场中有N个站台,分别标记为1到N。所有站台之间有M条单向路径,第i条路径是从站台Si开始到站台Ei,其中最高的栏的高度为Hi。无论如何跑,奶牛们都要跨栏。

奶牛们有T个训练任务要完成,第i个任务包含两个数字Ai和Bi,表示奶牛必须从站台Ai跑到站台Bi,可以路过别的站台。奶牛们想找一条路径从站台Ai到站台Bi,使路径上最高的栏的高度最小。

你的任务就是写一个程序,计算出路径上最高的栏的高度的最小值。

输入格式

第1行输入三个整数N,M,T;

接下来M行每行包含三个整数Si,Ei,Hi;

接下来T行每行包含两个整数,表示1个任务的起始站台和目标站台Ai,Bi;

输出格式

共T行,每行一个整数,表示1个任务中路径上最高栏的高度的最小值,如果无法到达,输出-1。

输入样例

5 6 3
1 2 12
3 2 8
1 3 5
2 5 3
3 4 4
2 4 8
3 4
1 2
5 1

输出样例

4 
8 
-1

输出说明

任务1:最简单的办法是直接从站台3到站台4。

任务2:和直接从站台1到站台2相比,更好的方法是站台1到站台3再到站台2。

任务3:没有路径从5开始,所以找不出路径。

数据规模

对于25%的数据:1≤N≤20;1≤M≤30;1≤T≤20;

对于50%的数据:1≤N≤100;1≤M≤2,000;1≤T≤2,000;

对于100%的数据:1≤N≤300;1≤M≤25,000;1≤T≤40,000;1≤Si,Ei,Ai,Bi≤N;1≤Hi≤10^6;

主要思路

这是一道Floyd模板题(多源)

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

——————————AC代码

#include<bits/stdc++.h>
using namespace std;
int n,m,q;
int f[301][301];
int main() {
    memset(f,0x3f,sizeof(f));
    scanf("%d%d%d",&n,&m,&q);
    for (int i = 1,a,b,c; i <= m; i++) {
        scanf ("%d%d%d", &a, &b, &c);
        f[a][b] = min (f[a][b], c);
    }
    for (int k = 1;k <= n; k++)
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                f[i][j] = min(f[i][j],max(f[i][k],f[k][j]));
    for(int i=1,u,v;i<=q;i++){
        cin>>u>>v;
        if(f[u][v]==0x3f3f3f3f)printf("-1\n");
        else printf("%d\n",f[u][v]);
    }
    return 0;
}

——————————QAQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值