caioj1092: 并查集(模版 家族)
2017-07-25 09:09
627 查看
1092: 并查集(模版 家族)
时间限制: 1 Sec 内存限制: 128 MB题目描述
【题意】
n个人,m条关系(x,y),表示x和y是同一家族的。
求最多可能有多少个家族。
(n<=100000,m<=1000000)
【输入格式】
第一行两个整数n和m(n<=100000,m<=1000000)
下来m行,每行两个整数x、y(1<=x,y<=n),表示一条关系.
【输出格式】
输出一个整数,表示最多可能有多少个家族。
【样例输入】
5 3
1 2
2 4
3 4
【样例输出】
2
并查集的一个模板题
关键是zuxian那一段函数
如果为了好理解可以去掉//
改为:
int zuxian(int x){ int zx; if (fa[x]!=x) zx=zuxian(fa[x]); else zx=x; fa[x]=zx;//路径压缩 return zx; }
若不加fa[x]=zx可能会超时,重复做了大量的工作,在结束时只需加一个小小的操作领x的父亲直接为zx,要直接认爸爸!才方便!
#include<iostream> #include<cstdio> using namespace std; int fa[110000]; int zuxian(int x){ // int zx; if (fa[x]!=x) fa[x]=zuxian(fa[x]); //else zx=x; //fa[x]=zx;//路径压缩 return fa[x]; } int main(){ int n,m,x,y; scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) fa[i]=i; for (int i=1;i<=m;i++){ scanf("%d%d",&x,&y); int fx=zuxian(x); int fy=zuxian(y); if (fx!=fy){ fa[fx]=fy; } } int ans=0; for (int i=1;i<=n;i++) if(fa[i]==i) ans++; printf("%d\n",ans); return 0; }
(CSDN每天只能发10篇。。。)
相关文章推荐
- 1092: 并查集(模版 家族)
- caioj1092 并查集模板
- [差分约束系统] caioj1400: 【差分约束(模版)】区间
- [caioj 1094] 并查集3(校园白社会)---带权并查集
- caioj1093: 并查集2(删边问题)
- 【NOI2002】caioj1095: 并查集4(银河英雄传说)
- caioj1094·并查集3(校园白社会)
- vijos1034 家族(并查集模版)
- 1092: 并查集模版
- hdu 1232 畅通工程 并查集模版
- 九度OJ-1444:More is better(用并查集求集合大小)
- 【杭电OJ】并查集--1232-畅通工程
- Tsinsen-A1491 家族【并查集】
- 九度 OJ 1092 Fibonacci
- codevs 1073 家族 并查集
- 九度OJ 1092 Fibonacci
- HLJUOJ1197(并查集思想)
- 并查集模版
- “我什么都不知道,我只知道caioj最强”
- [置顶] Polya计数法浅析&caioj1475【Polya计数法】项链上的珠子