并查集
基础模板
int f[N], sz[N];
//查找集合,压缩路径
int Find(int x) { return f[x] == x ? x : f[x] = Find(f[x]); }
//合并操作
void merge(int x, int y)
{
int fx = Find(x);
int fy = Find(y);
if (fx != fy)
{
//将小的集合归到大的集合上
if (sz[fx] > sz[fy])
{
sz[fx] += sz[fy];
f[fy] = fx;
}
else
{
sz[fy] += sz[fx];
f[fx] = fy;
}
}
}
进阶应用:
poj1988 带权并查集
poj1182 多状态并查集
poj1703 多状态并查集
比poj1182简单一点,做法相同
第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳) B题
优先队列
优先队列其实就是堆,在C++的stl中提供了priority_queue容器
priority_queue<int> q; //在默认情况下是大根堆
priority_queue<int, vector<int>, less<int> > q; //大根堆
priority_queue<int, vector<int>, greater<int> > q; //小根堆
//如果是自定义数据类型的话需要重载 < 运算符