题目链接 :http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2827&cid=1749
数小区
Time Limit: 1000MS Memory limit: 65536K
题目描述
某城市有n个人,现在给定关于n个人的m条信息,m条信息是两个人在同一个小区,根据所给信息,判断这个城市最多可能有多少个小区。n个人编号为1~n。
输入
多组输入。
每组第一行有两个整数n,m(2 <= n <= 50000, 0 <= m <= n/2)。
接下来m行,每行两个整数a,b,表示a和b在同一个小区。
输出
根据所给信息,输出这个城市最多可能有多少个小区。
示例输入
5 2 1 2 3 4
示例输出
3
提示
来源
xj
示例程序
代码如下
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- int n, m, pre[50000+5];
- int root(int a) \\查找
- {
- int x=a;
- while(x!=pre[x])
- {
- x=pre[x];
- }
- while(a!=x) \\路径压缩
- {
- pre[a]=x; \\将a到x路径的所有pre值更新为x,大量减少了查找时while的循环时间
- a=pre[a];
- }
- return x;
- }
- int main()
- {
- while(~scanf("%d %d", &n, &m))
- {
- for(int i=1;i<=n;i++) \\初始化pre
- pre[i]=i;
- while(m--)
- {
- int a, b;
- scanf("%d %d", &a, &b);
- if(root(a)!=root(b)) \\合并
- pre[root(a)]=root(b);
- }
- int cnt=0;
- for(int i=1;i<=n;i++)
- if(pre[i]==i) cnt++;
- printf("%d\n",cnt);
- }
- return 0;
- }