擒贼先擒王(并查集)

擒贼先擒王(并查集)

题目描述:

快过年了,犯罪团伙也开始为了年终奖而奋斗,最近小明所在社区发生许多抢劫事件,由于强盗人数过于庞大,作案频繁,警方想查清楚到底有几个犯罪团伙实在是不容易了,警察叔叔还是搜索到了一些线索想让你分析有多少团伙。

输入描述:

第一行输入两个数n,m分别为有n个强盗,强盗之间的关系有m条。接下来的m行每行输入两个数x,y表示是一伙。

输出描述:

输出一共有几个团伙

输入样例:

11 10
1 2
3 4
5 2
4 6
2 6
7 11
8 7
9 7
9 11
1 6

输出样例:

3

思路:

首先每个编号为数组下标的贼的boss都是本身,然后对输入的两个有关系的贼,用递归函数把他们的boss找出来,让一个boss归顺另一个boss,这样连他们的手下都归顺了,最后遍历数组,如果贼的boss为其本身,即f[i]==i,则为一个团伙,只要找出团伙的boss就知道有几个团伙了。

代码:

#include<stdio.h>
int f[1100];  //用于存放每个编号为数组下标的贼的boss 
int n,m; 

void init()
{   //初始化,每个贼的boss都为自己 
	for(int i=1;i<=n;i++)
		f[i]=i;
	return ;
}

int find(int v)
{   //寻找贼的boss 
	if(f[v]==v)  
		return v;
	else
	{    //下面这一步为路径压缩,不然会形成一个长链,不方便找boss,运行会超时
		f[v]=find(f[v]); //将每个贼的boss直接等于团伙头目,而不是一层一层的寻找boss 
		return f[v]; 
	}
}

void merge(int v,int u)
{
	int t1,t2;
	t1=find(v);  //寻找两个贼的boss 
	t2=find(u); 
	if(t1!=t2)
	{    //如果两个贼的boss不相等 
		f[t2]=t1;  //将一个贼的boss归顺另一个贼的boss,其整个团队都归顺。 
	}
	return ;	
}

int main()
{
	int x,y,sum=0;
	scanf("%d %d",&n,&m);
	init();  //初始化 
	for(int i=1;i<=m;i++)
	{   //输入贼之间的关系 
		scanf("%d %d",&x,&y);
		merge(x,y); //并查集 
	}
	for(int i=1;i<=n;i++)
		if(f[i]==i)  //如果贼的boss为自己,则是整个团伙的头,就算一个团伙 
			sum++;
	printf("%d",sum);
	return 0;	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Class)是微软推出的一种基于C++的应用程序框架,用于开发Windows平台的图形用户界面(GUI)应用程序。如今,MFC已经成为Windows平台上最为广泛应用的开发框架之一。而CSDN则是中国最大的IT技术社区,有着丰富的技术资源和编程教程。 如果想要学习MFC编程,CSDN是一个非常好的学习网站,这里提供了许多MFC入门教程。在学习MFC的过程中,首先需要具备C++编程基础,因为MFC是基于C++的。 CSDN的MFC入门教程通常会从MFC的基本概念、开发环境的搭建以及常用控件的使用等方面展开。通过这些教程,你可以学习如何创建一个MFC应用程序、如何设计界面、如何处理用户输入等。 此外,MFC还提供了许多强大的类和函数,用于实现各种功能,比如文件操作、数据库连接、图形绘制等。在学习MFC的过程中,你还可以学到如何利用这些类和函数开发具有自定义功能的应用程序。 值得一提的是,学习MFC不仅仅是学习这个框架本身,还要了解Windows平台的相关知识,比如消息循环机制、事件处理等。这些知识对于正确理解和使用MFC是必不可少的。 总而言之,MFC是一个强大的GUI开发框架,而CSDN则为我们提供了详细的MFC入门教程。通过学习这些教程,你可以快速入门,并掌握MFC开发所需的基本知识和技能。但需要注意的是,MFC的学习是一个长期的过程,需要不断地实践和积累经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值