问题 A: 校赛题:DG之社团调查

问题 A: 校赛题:DG之社团调查

时间限制: 1 Sec 内存限制: 128 MB
提交: 734 解决: 62
[提交][状态][讨论版]
题目描述

自从进了大学,DG发现周围所有的同学几乎都进了社团,他十分想知道同学们究竟都参加了多少个不同的社团。但是DG觉得直接问同学参加了什么社团不够礼貌,因为那样就显得自己对同学不够关心了解。于是聪明的DG想到了另外一种问法:“A和B是否是同一个社团?”。这样一来虽然DG不能直接得到同学参加社团的信息,但是他可以从这次些关系中统计出周围人所参与的社团的个数(假如每个同学最多只能参加一个社团,没有人参加的社团不用考虑)。要么,你也来试一试?

输入

输入包含多组测试数据;
每组测试数据的第一行包含两个整数n,m。其中n表示总人数。接下来有m行,每行有两个整数i,j,表示i,j两人同属于一个社团; (0 < n <= 50000,0 <= m <= n(n-1)/2)
当n=m=0时输入结束。
输出

对于每组测试样例输出一行,表示被询问到的人最多参加了多少个不同的社团。

样例输入

10 9
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
10 4
2 3
4 5
4 8
5 8
0 0
样例输出

1
7
提示

 

#include<iostream>
#include<stdio.h>
using namespace std;
const int N=50005;
int uniset[N];
int count[N];

int parent(int a)
{
int tmp = a;
while(uniset[tmp] != tmp)
tmp = uniset[tmp];
return tmp;
}
int main(void)
{

int n,m;
int first,second;
while(scanf("%d%d",&n,&m) && (n != 0 && m != 0))
{
for(int i = 0;i < N;i++)
{
uniset[i] = i;
count[i] = 1;
}
for(int i = 0;i < m;i++)
{
scanf("%d%d",&first,&second);
int pf = parent(first);
int ps = parent(second);
if(pf < ps)
{
uniset[ps] = pf;
count[pf] += count[ps];
count[ps] = 1;
}
else if(pf > ps)
{
uniset[pf] = ps;
count[ps] += count[pf];
count[pf] = 1;
}
}
int total = 0;
int add = 0;

for(int i = 0;i < n;i++)
{
if(count[i] > 1)
{
total += count[i];
add++;
}
}
cout<<n-total+add<<endl;
}
}

posted on 2013-04-30 15:08  gorllen  阅读(158)  评论(0)    收藏  举报