1. 题目解析与算法选择
1.1 问题重述与分析
这道题目描述了一个有趣的场景:奶牛贝茜在洞穴系统中探险,洞穴由N个洞室和M条双向通道组成。其中有K个洞室存放干草,贝茜每吃一捆干草体重增加1。每条通道有宽度阈值,当贝茜的体重超过阈值时就会被卡住。我们需要计算贝茜从洞室1出发并返回洞室1的情况下,最多能吃多少捆干草。
关键约束条件:
- 路径必须形成回路(从1出发回到1)
- 整个路径上的所有通道阈值都必须≥当前体重
- 可以自由选择是否吃某个洞室的干草
1.2 算法选择与思路
这个问题可以转化为图论中的路径搜索问题。我们需要找到一条从1出发回到1的路径,使得路径上所有边的最小阈值最大化,同时在这条路径上尽可能多地经过有干草的洞室。
核心思路分为两个阶段:
- 预处理阶段:使用Floyd算法计算所有洞室对之间的路径最小最大阈值
- 贪心选择阶段:基于预处理结果选择可以安全食用的干草
选择Floyd算法是因为:
- 时间复杂度O(N^3)对于N≤100完全可接受
- 需要计算所有洞室对之间的路径信息
- 可以方便地处理最小最大阈值问题
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码实现详解
2.1 数据结构设计
cpp复制int d[101],dd[101],mp[101][101];
d[]:存储有干草的洞室编号dd[]:存储从洞室1到各干草洞室的最小最大阈值mp[][]:邻接矩阵,存储洞室间的通道阈值
初始化技巧:
cpp复制for(int i=1;i<=n;i++) mp[i][i]=1433223;
这里将自环设为一个大数(1433223),确保不影响后续的最小值计算。
2.2 Floyd算法实现
cpp复制for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mp[i][j]=max(mp[i][j],min(mp[i][k],mp[k][j]));
这是标准的Floyd算法变种,计算的是i到j路径上最小阈值的最大值(瓶颈值)。其核心思想是:
- 对于每个中间节点k,检查i→k→j路径的最小阈值是否优于已知的i→j路径
- 使
