洛谷 P1525 关押罪犯(算法竞赛进阶指南, 并查集,贪心)

本篇博客聚焦于算法竞赛进阶指南中的P1525题目,通过讲解如何利用贪心策略与并查集解决关押罪犯的问题。首先,将所有边按怒气值降序排列,确保最大冲突的罪犯被分开。接着,借助并查集进行集合操作,判断边的两端点是否已分配至同一监狱。如果端点在同一集合,该边即为答案。通过扫描每条边,更新并查集状态,确保正确归类罪犯。
摘要由CSDN通过智能技术生成

算法竞赛进阶指南,261页,并查集,贪心
本题要点:
1、贪心:
先把所有的边从大到小排序,然后依次将边的两个点分到不同的两监狱中。
(越大的怒气值的一组罪犯应分在两个不同的监狱里)
如果选到某一条边,这条边的两个端点恰好在同一个集合中,说明这条边的长度就是答案。
2、使用并查集:
扫描每条边,两个端点(假设两个点为a, b点)位于不同的监狱中,这两个点互为敌人;
如果a点有敌人(enemy[a] != 0),说明之前a点已经被分配到某个监狱了, 那么b点应该加入 enemy[a] 所在的集合;
如果a点没有敌人(enemy[a] == 0),说明之前a点是第一次扫描到, 令 enemy[a] = b;
b点类似处理;

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MaxN = 20010;
const int MaxM = 100010;
int n, m;
int fa[MaxN], enemy[MaxN];		//数组 enemy[i] 记录第i点的敌人

struct rec
{
   
	int x, y, z;
	bool operator< (const rec& rhs)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值