HDU 1213 并查集
2014-05-14 14:38
183 查看
#include<iostream> using namespace std; const int MaxN=1001; int P[MaxN],size[MaxN]; void InitSets(int n) { for(int i=0;i<=n;i++) { P[i]=i; size[i]=1; } } int FindSets(int x) { int y=x; while(P[x]!=x)x=P[x]; while(y!=x) { int t=P[y]; P[y]=x; y=t; } return x; } bool Union(int x,int y) { int fx,fy; fx=FindSets(x); fy=FindSets(y); if(fx==fy)return false; if(size[fx]>=size[fy]) { P[fy]=fx; size[fx]+=size[fy]; } else { P[fx]=fy; size[fy]+=size[fx]; } return true; } int main() { int T; cin>>T; for(int x=0;x<T;x++) { int N,M,i; cin>>N>>M; InitSets(N); for(i=0;i<M;i++) { int a,b; cin>>a>>b; Union(a,b); } int cnt=0; for(i=1;i<=N;i++) { if(P[i]==i)cnt++; } cout<<cnt<<endl; } return 0; }
优化——路径压缩
思想:每次查找的时候,如果路径较长,则修改信息,以便下次查找的时候速度更快
步骤:第一步,找到根节点;第二步,修改查找路径上的所有节点,讲他们都指向根节点
相关文章推荐
- HDU 1213 How Many Tables (dfs求联通块 || 并查集)
- hdu 1213 How Many Tables(简单的并查集)
- hdu 1213 How Many Tables (并查集)
- hdu杭电1213 How Many Tables【并查集】
- HDU 1213 How Many Tables(并查集)
- HDU 1213 How Many Tables(并查集)
- hdu 1213 (How Many Tables)(简单的并查集,纯模板)
- 【并查集】 HDU 1213 How Many Tables
- HDU 1213 How Many Tables(简单并查集)
- HDU - 1213 How Many Tables ——并查集
- hdu 1213 How Many Tables(并查集求无向图有几个连通分量)
- HDU 1213 How Many Tables (并查集)
- HDU 1213 How Many Tables(并查集)
- hdu 1213 并查集
- HDU 1213 How Many Tables 并查集 水~
- HDU 1213 How Many Tables(并查集)
- hdu 1213 How Many Tables(并查集学习)
- HDU 1213 How Many Tables (基础并查集)
- hdu 1213 How Many Tables 并查集模板题+路径压缩
- hdu 1213 (并查集)