蓝桥杯每日一题:《公路与铁路》

文章讲述了如何使用Floyd算法解决一个带有特定条件的最短路径问题,即在不允许汽车和火车同时到达同一中间城市的情况下,找到从城市1到城市n的最短时间。通过分析,作者指出这个条件实际上并不影响算法的基本应用,最终通过Floyd算法分别计算汽车和火车的最短路径并取最大值作为结果。
摘要由CSDN通过智能技术生成

来源:4074. 铁路与公路 - AcWing题库

思路: 最短路径,但是题目中有烦人的条件,即汽车和火车不能同时到达同一个中间城市(1,n除外),

如果没有这个条件,那么这道题就是分别求两次最短路径即可。

其实这是个坑人的条件

我们来细想一下

首先,1-n之间各个城市都是有路的,不是公路就是铁路,那么城市1和城市n之间,必然有一条公路或者铁路,假如1-n之间是公路,那么汽车直接走,便是1h,火车必然要绕开这条路,从别的城市中转。

同理,假如这条路是铁路,那么汽车就要去别的城市中转,所以其实这个条件就是迷惑人用的。

而且迷惑到我了:(

数组f[i][j]是i城市到j城市的距离

默认初始化为无穷大表示无穷远即两者之间没有路

#include <iostream>
#include <cstring>
#include <algorithm>
#include <limits.h>
using namespace std;
int m,n;
const int N = 500;
#define INF 0x3f3f3f3f
int f[N][N],g[N][N];
int floyd(int e[][N])
{
   for(int k=1;k<=n;k ++)
                for(int i=1;i<=n;i++)
                    for(int j=1;j<=n;j++)
                            e[i][j] = min(e[i][j],e[k][j]+e[i][k]);
    return e[1][n];
}
int main()
{
    cin>>n>>m;
    memset(f, 0x3f, sizeof f);
    memset(g, 0x3f,sizeof g);
    while(m--)
    {
      int a,b;
      scanf("%d%d", &a, &b);
      f[a][b] = f[b][a] = 1;
    }
    for(int i = 1;i<=n;i++)
        for(int j = 1;j<=n;j++)
            if(i!=j&&f[i][j]!=1)
            g[i][j] = 1;
            
            
            int res = max(folyd(f),folyd(g));
            if(res == INF)
            cout<<"-1"<<endl;
            else
            cout<<res<<endl;
}

如果不会floyd的可以看这篇文章,讲的蛮好的!

佛洛依德算法最短路径

有关0x3f3f3f3f的问题点这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值