南邮 OJ 1798 亲友团问题

本文介绍了一种解决亲友团问题的方法,通过输入参赛亲友的数量及已知的亲友团信息,利用并查集算法预测需要划分的独立区域数量,确保比赛现场的安全与秩序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

亲友团问题

时间限制(普通/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);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值