并查集模板
Posted LuZhiyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集模板相关的知识,希望对你有一定的参考价值。
//普通并查集模板 #include<iostream> using namespace std; const int MAX=10004; int fat[MAX];//存放每个节点的根节点 //找x的根节点并且把路径上的每个节点的父节点改成根节点 int find(int x) //while找根节点 { int rt=x; while(fat[rt]!=rt) rt=fat[rt]; int i=x,j; while(i!=rt){ j=fat[i]; fat[i]=rt; i=j; } return rt; } int Find(int x) //递归找根节点 { if(fat[x]!=x) fat[x]=Find(fat[x]); return fat[x]; } void connect(int x,int y) //x的根节点合并到y的根节点上 { int xx=find(x),yy=find(y); if(xx!=yy) fat[xx]=yy; } int main() { return 0; } ********************************************************** //算点的转移次数 #include<iostream> #include<cstring> using namespace std; const int MAX=10004; int fat[MAX];//存放每个节点的根节点 int num[MAX];//记录节点的转移次数 int cnt[MAX];//某点的权值 int find(int x) { if(fat[x]!=x){ int tmp=fat[x]; fat[x]=find(fat[x]); num[x]+=num[tmp];//x点转移的次数是他的转移次数加上父节点的转移次数。 } return fat[x]; } void connect(int x,int y) { int xx=find(x),yy=find(y); if(xx!=yy){ fat[xx]=yy; num[xx]++;//开始转移了一次 cnt[yy]+=cnt[xx];//权值转移了 } } int main() { memset(num,0,sizeof(num)); return 0; }
以上是关于并查集模板的主要内容,如果未能解决你的问题,请参考以下文章
带权并查集(含种类并查集)经典模板 例题:①POJ 1182 食物链(经典)②HDU - 1829 A bug's life(简单) ③hihoCoder 1515 : 分数调查(示例代码(代