当前位置: 首页 > news >正文

题解:洛谷 P1967 [NOIP 2013 提高组] 货车运输

【题目来源】

洛谷:P1967 [NOIP 2013 提高组] 货车运输 - 洛谷

【题目描述】

A 国有 \(n\) 座城市,编号从 \(1\)\(n\),城市之间有 \(m\) 条双向道路。每一条道路对车辆都有重量限制,简称限重。

现在有 \(q\) 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。

【输入】

第一行有两个用一个空格隔开的整数 \(n,m\),表示 A 国有 \(n\) 座城市和 \(m\) 条道路。

接下来 \(m\) 行每行三个整数 \(x, y, z\),每两个整数之间用一个空格隔开,表示从 \(x\) 号城市到 \(y\) 号城市有一条限重为 \(z\) 的道路。
注意:\(x \neq y\),两座城市之间可能有多条道路。

接下来一行有一个整数 \(q\),表示有 \(q\) 辆货车需要运货。

接下来 \(q\) 行,每行两个整数 \(x,y\),之间用一个空格隔开,表示一辆货车需要从 \(x\) 城市运输货物到 \(y\) 城市,保证 \(x \neq y\)

【输出】

共有 \(q\) 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。
如果货车不能到达目的地,输出 \(-1\)

【输入样例】

4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3

【输出样例】

3
-1
3

【算法标签】

《洛谷 P1967 货车运输》 #图论# #贪心# #倍增# #并查集# #Kruskal重构树# #生成树# #最近公共祖先LCA# #NOIP提高组# #2013#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 10005;        // 最大节点数
const int M = 80005;        // 最大边数// 边结构体
struct Edge
{int a, b, w = -1;       // 边的两个端点和权重,默认-1
} e[M];int n, m, k;                // n:节点数, m:边数, k:查询数
int p[N];                   // 并查集父节点数组
int ans[30005];             // 存储每个查询的答案
set<int> s[N];              // 每个连通分量中存储的查询ID集合
set<int>::iterator it;      // 集合迭代器// 自定义比较函数:按权重降序排序
bool cmp(Edge x, Edge y)
{return x.w > y.w;
}// 并查集查找操作(带路径压缩)
int find(int x)
{if (p[x] != x){p[x] = find(p[x]);}return p[x];
}int main()
{// 输入节点数和边数cin >> n >> m;// 输入所有边的信息for (int i = 1; i <= m; i++){int a, b, w;cin >> a >> b >> w;e[i] = {a, b, w};}// 将边按权重从大到小排序sort(e + 1, e + m + 1, cmp);// 初始化并查集for (int i = 1; i <= n; i++){p[i] = i;}// 输入查询数量cin >> k;int len = 0;  // 查询ID计数器// 处理每个查询for (int i = 1; i <= k; i++){len++;int a, b;cin >> a >> b;// 将查询ID添加到两个端点对应的集合中s[a].insert(len);s[b].insert(len);ans[len] = -1;  // 初始化答案为-1(表示尚未连通)}// 按权重从大到小处理边(类似Kruskal算法)for (int i = 1; i <= m; i++){int a = find(e[i].a);  // 查找起点所在连通分量的根int b = find(e[i].b);  // 查找终点所在连通分量的根int w = e[i].w;        // 当前边的权重// 如果两个端点不在同一个连通分量中if (a != b){// 启发式合并:总是将小集合合并到大集合if (s[a].size() < s[b].size()){swap(a, b);}// 遍历小集合中的所有查询IDfor (it = s[b].begin(); it != s[b].end(); it++){int id = *it;  // 查询ID// 如果大集合中也包含这个查询ID,说明两个端点现在连通了if (s[a].count(id)){ans[id] = w;      // 记录连通时的最小瓶颈权重s[a].erase(id);   // 从集合中移除已解决的查询}else{s[a].insert(id);  // 否则将查询ID加入大集合}}// 合并两个连通分量p[b] = a;}}// 输出所有查询的答案for (int i = 1; i <= k; i++){cout << ans[i] << endl;}return 0;
}

【运行结果】

4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
3
-1
3
http://www.jsqmd.com/news/394950/

相关文章:

  • 负债上岸不踩坑!口碑好的贷款信用卡个人债务协商公司,渠道+服务全揭秘 - 代码非世界
  • 题解:洛谷 P1396 营救
  • 从0学习pwn【第一章】PWN学习环境搭建
  • 负债逾期别乱投医!2026正规债务协商规划机构排行榜,上岸党实测推荐 - 代码非世界
  • 题解:洛谷 P1194 买礼物
  • 避免提示设计踩雷的秘诀:提示工程架构师的用户流程测试风险评估
  • 免费白嫖可灵+阿里顶级AI,图片视频随便生!不限量
  • 大语言模型在AI原生应用领域的未来展望
  • 题解:洛谷 P3366 【模板】最小生成树
  • 大数据领域数据服务的人工智能算法优化
  • 【每日一题】LeetCode 696. 计数二进制子串
  • 信用卡逾期不用慌!全国专业贷款协商与逾期处理律所实测推荐,负债人上岸指南 - 代码非世界
  • 关于本人发布的应用的隐私策略
  • 股市赚钱学概论:赚钱理之一,赚红利的钱
  • 大数据领域数据工程的边缘计算数据处理方案
  • ANSYS/LS-DYNA 隧道光面爆破数值模拟(CAD+LS-DYNA)课程说明:模型建立、...
  • 我用 AI 写了四五个软件之后的总结
  • 测试一下32位CPU和64位CPU下的long类型变量大小
  • 《解析AI应用架构师眼中人机协作在未来工作的独特优势》
  • 大学生HTML期末大作业——HTML+CSS+JavaScript购物商城(车之家)完整教程:从入门到实战部署
  • 企业微信协议接口的安全合规性设计与审计实践 - 教程
  • 意义的主权:AI元人文视域下的古典智慧重释与AI时代的人类责任
  • 2025年GPU算力租赁市场总结
  • 高级java每日一道面试题-2025年7月10日-基础篇[LangChain4j]-如何集成多个不同的 Model Provider(如同时使用 OpenAI 和本地模型)?
  • 城市交通流量实时采集与拥堵预测系统设计
  • 微信小程序Python运动健身户外运动体能训练系统
  • 互联网大厂Java面试场景:音视频与微服务技术深度解析
  • 微信小程序Python英语学习小助手的设计
  • 战略洞察:小略AI转型与科技突破