亲友团问题
总提交 : 355 测试通过 : 75
比赛描述
在2014“华为杯”南邮大学生团体歌唱大赛每一个轮比赛现场,众多亲友团是一道亮丽的风景,他(她)们或来助威、或来观摩、或来刺探对手情报,不同亲友团之间偶尔还起冲突。为避免安全问题,主办方在赛场会划分许多独立区域,每一个区域安置一个亲友团,现在请你根据主办方提供的比赛现场信息,预测至多需要划分出多少个独立区域。
我们将主办方提供的比赛现场信息进行简化,从1开始按顺序给进入比赛现场的每位亲友分配一个编号,依次为1、2、...、K,K为亲友总数,为保护隐私,主办方只能告诉你M组两个不同亲友属于同一亲友团信息,这些信息有可能重复。
输入
输入包括多个测试用例,首先给出测试用例数N,接着给出N个测试用例,1≤N≤100。
每一个测试用例包括M+1行,首先给出两个整数K和M;再依次给出M行,每行给出两个不同正整数i和j,表示两个不同亲友i和j属于同一亲友团,i≠j,1≤i≤K,1≤j≤K,,1≤K≤10000,1≤M≤10000。
输出
输出包括多行,对于每个测试用例,输出一行,给出至多需要划分出的独立区域数量。
样例输入
2
3 1
1 2
3 2
1 2
2 3
样例输出
2
1
题目来源
SED
//a[i]标志第i号家属所在队伍的最小编号
#include<stdio.h>
int a[10000];
int f(int n){
return a[n]==n?n:a[n]=f(a[n]);
}
int main(){
int N,K,M;
int i,j;
scanf("%d",&N);
while(N--){
scanf("%d%d",&K,&M);
for(i=0;i<K;i++)
a[i]=i;
while(M--){
scanf("%d%d",&i,&j);
if(f(--i)!=f(--j)){
if(a[i]<a[j])
a[a[j]]=a[i];
else
a[a[i]]=a[j];
}
}
for(M=0,i=0;i<K;i++)
if(a[i]==i)
M++;
printf("%d\n",M);
}
}