南邮 OJ 1798 亲友团问题

亲友团问题

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 355            测试通过 : 75 

比赛描述

2014华为杯南邮大学生团体歌唱大赛每一个轮比赛现场,众多亲友团是一道亮丽的风景,他(她)们或来助威、或来观摩、或来刺探对手情报,不同亲友团之间偶尔还起冲突。为避免安全问题,主办方在赛场会划分许多独立区域,每一个区域安置一个亲友团,现在请你根据主办方提供的比赛现场信息,预测至多需要划分出多少个独立区域。

我们将主办方提供的比赛现场信息进行简化,1开始按顺序给进入比赛现场的每位亲友分配一个编号,依次为12...KK亲友总数为保护隐私,主办方只能告诉你M组两个不同亲友属于同一亲友团信息,这些信息有可能重复




输入

输入包括多个测试用例,首先给出测试用例数N,接着给出N个测试用例1≤N≤100

每一个测试用例包括M+1行,首先给出两个整数KM再依次给出M行,每行给出两个不同正整数ij,表示两个不同亲友ij属于同一亲友团,ij1iK1jK1≤K≤100001≤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);
	}
}


你可能感兴趣的:(ACM,南邮OJ,亲友团问题)