算法竞赛进阶指南,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)