PKU并查集,秩的运用
2013-07-23 14:06
274 查看
http://poj.org/status?result=0&user_id=297752873
View Code
#include<stdio.h>// #include<stdlib.h> int bin[30010],rank[30010];// int findx(int x) { if(bin[x]!=x) bin[x]=findx(bin[x]);//回溯是的压缩路径 return bin[x]; } void merge(int x,int y)//这个函数里重要的是启发式合并,rank称为秩,这里是感染总数,但其实也是深度 { int fx,fy; fx=findx(x); fy=findx(y); if(fx==fy) return ; if(rank[fx]>rank[fy])//这里的判断是要将深度小的作为最终节点 { bin[fy]=fx;//把大的接到小的那里 rank[fx]+=rank[fy];//然后把二者存储的感染总数相加,得合并的结果 } else{ // bin[fx]=fy; rank[fy]+=rank[fx]; } } int main() { int i,n,m,max,t,x; while(scanf("%d%d",&n,&m),n||m) { for(i=0;i<n;i++) bin[i]=i,rank[i]=1;//bin保存根结点,rank保存每个节点下的感染总数,其实也就是深度 while(m--) { scanf("%d",&t); for(i=0;i<t;i++) { scanf("%d",&x); if(i==0) max=x;//如果是第一个,那就保存,留着跟之后的合并 else merge(max,x);//两个集合进行合并 } } x=findx(0);//找寻0的根结点 printf("%d\n",rank[x]);//输出根结点存储的感染总数 } return 0; }
View Code
相关文章推荐
- Gym - 100783F City Park(并查集的运用)
- pku 1703 Find them, Catch them(并查集)
- C. Glass Carving (CF Round #296 (Div. 2) STL--set的运用 && 并查集方法)
- pku1611 并查集
- [PKU 1182] 食物链 (种类并查集+维护边权)
- 有两个种类的并查集——pku2492
- 【算法】并查集的运用
- pku 1308 并查集应用
- Pku2054 Color a Tree(并查集优化+堆优化+贪心)
- HDOJ3635 并查集简单运用
- Codeforces 292D (并查集巧妙运用)
- POJ-1182食物链(并查集的运用)
- pku 1611(并查集)
- pku 1456 Supermarket 贪心优先队列的应用 or 并查集
- pku1733 Parity game(离散化+并查集拓展应用)
- pku 1308 Is It A Tree?(并查集)
- pku 1703 Find them, Catch them(并查集)
- pku 1988 poj Cube Stacking 并查集
- POJ 1182并查集的经典运用
- pku 1988 Cube Stacking(并查集扩展)