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

题解:P1196 [NOI2002] 银河英雄传说

P1196 [NOI2002] 银河英雄传说

这是一道绿题
核心考察点只有一个: 那就是带权并查集


\(\mathcal{Part\ I}\)

我们检查题意不难发现这道题的要求无非两个:
$\ \ $ 1 ) 维护多个链的不断合并,但是以链中某节点作为索引
$\ \ \ \ \ \ \ $ 所以我们考虑并查集
$\ \ $ 2 ) 查询两个节点是否在某个链中,并且求出他们之间的权值差
$\ \ \ \ \ \ \ $ 因为要查询权值,而且并查集没有什么很好的伴生算法,只能使用带权并查集


\(\mathcal{Part\ II}\)

实现过程的话。。。其实就是标程
讲一遍吧(
$\ $
初始化并查集,这里分两步:

合并的时候,我们把第一集合的祖先的祖先插到第二集合的祖先上
这时关键的点在于不用更新每一个第一集合的点
我们退而求其次,只更新第一集合原祖先到队头的距离和当前总集合的大小
最后因为还要路径压缩,在路径压缩的时候顺下来就好了


查询的时候,我们查询的时候因为也要调用find函数两次,所以也可以帮忙顺一遍并查集的权值
这里的代码框架的好处就在于,不管我们要进行哪些操作,我们的更新写在find里,导致我们不用担心合并-查询的数据崭新度
而我们查询的操作极其简单,查询两个节点的祖先是否在同一个
如果不是,输出 -1
如果是,那么输出他们两个在链上的权值差-1就好了,这个-1是因为要计算他们之间隔了多少个

非常愉快,这个代码就写完了
我这边单独把 find 贴出来方便理解


int Find(int x) {if (x == fa[x]) return x; //回溯操作int k = fa[x]; //临时变量fa[x] = Find(fa[x]); //路径压缩s[x] += s[k]; //更新权值大小b[x] = b[fa[x]]; //更新集合大小return fa[x]; //传递
}

\(\LARGE{\mathcal{CODE}}\)


#include <bits/stdc++.h>using namespace std;const int N = 3e4 + 10;
int T, fa[N], s[N], b[N];int Find(int x) {if (x == fa[x]) return x;int k = fa[x];fa[x] = Find(fa[x]);s[x] += s[k];b[x] = b[fa[x]];return fa[x];
}void SolveM() {int x, y;cin >> x >> y;int dx = Find(x);int dy = Find(y);fa[dx] = dy;s[dx] += b[dy];b[dx] = b[dy] = b[dy] + b[dx];
}void SolveC() {int x, y;cin >> x >> y;int dx = Find(x);int dy = Find(y);if (dx != dy) {cout << "-1" << endl;return;}cout << abs(s[x] - s[y]) - 1 << endl;
}int main() {ios::sync_with_stdio(false);    cin.tie(nullptr);cout.tie(nullptr);cin >> T;for (int i = 1; i <= 30000; i++) {fa[i] = i;s[i] = 0;b[i] = 1;}while (T--) {char ch;cin >> ch;if (ch == 'M') {SolveM();}if (ch == 'C') {SolveC();}}return 0;
}
http://www.zskr.cn/news/26448.html

相关文章:

  • 2025年陶瓷过滤机厂家权威推荐榜:真空/盘式/矿用/全自动/真空带式陶瓷过滤机,固液分离设备,尾矿处理设备,圆盘过滤机专业选购指南
  • 2025 装修公司推荐排行榜单:江苏/浙江/制药厂/厂房/实验室/办公室/店面/净化室装修公司推荐,实测老客复购率与专业能力
  • xupt 3g移动开发实验室二面
  • 碰一碰,秒更新!游戏近场快传助力多人联机无缝组队
  • Moka AI 驱动 HR系统转型实践案例:从技术探索到组织价值落地的全链路解析
  • 2025年服饰厂家权威推荐榜:棒球帽,卫衣,羽绒服源头厂家精选,潮流设计与舒适品质口碑之选
  • 阿里云SLB指标监控
  • 洛谷题单指南-进阶数论-CF632D Longest Subsequence
  • 2025 年最新推荐锯床实力厂家排行榜:龙门 / 数控 / 金属带锯床等多类型设备权威甄选优质企业角度/金属带/双立柱/小型/大型锯床厂家推荐
  • 20232313 2025-2026-1 《网络与系统攻防技术》实验二实验报告 - 20232313
  • 九种UML常见图 -2025.10.19
  • 2025 年电缆桥架生产厂家最新推荐排行榜:聚焦北方 / 河北区域及瓦楞 / 防火 / 模压 / 镀锌桥架优质品牌深度解析
  • JavaScript 开发代码规范指南
  • 04.Python百行代码制作查询工具
  • 2025 油烟机厂家最新推荐榜:五大实力厂商技术与服务口碑评测权威发布滑轨/易清洁/免清洗/智能油烟机厂家推荐
  • VUE---打印功能
  • 鸿蒙NEXT网络管理:从“能用”到“智能”的架构演进 - 指南
  • PostgreSQL可观测性完整方案
  • 2025年大连甘井子区优质养老机构推荐:从社区到自然的暖心之选
  • 2025年主轴维修厂家企业推荐: 电/高速/精密/磨床/进口磨床/加工中心电/数控机床/高速电主轴维修厂家,服务商助力制造企业降本增效
  • 在写left join的时候 是大表在左侧 还是小表在左侧(一)
  • 【IEEE出版】2025年智能控制与计算科学国际学术会议 (ICICCS 2025)
  • 2025 年地铺石厂家最新推荐榜:涵盖生态/仿石/陶瓷等品类,揭秘行业口碑优质企业18厚/火烧/庭院/陶瓷地铺石厂家推荐
  • 2025-10-20-随感
  • 2025电源适配器厂家推荐,华威仕电子科技专业制造实力企业
  • Jupyter Notebook下载安装启用教程(附安装包,图文并茂)
  • oracle查询某一天的数据,即日期条件使用
  • Redis 哨兵模式搭建教程(基于 Docker,附完整配置与避坑指南)
  • 第十六章:固本培元,守正出奇——Template Method的模板艺术 - 教程
  • 实用指南:点鼠标左键一下变两下怎么回事?真相和解决方案