7-25 朋友圈 (25 分)(详解+并查集的了解和应用)

一:题目

某学校有N个学生,形成M个俱乐部。每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈。一个学生可以同时属于若干个不同的俱乐部。根据“我的朋友的朋友也是我的朋友”这个推论可以得出,如果A和B是朋友,且B和C是朋友,则A和C也是朋友。请编写程序计算最大朋友圈中有多少人。

输入格式:
输入的第一行包含两个正整数N(≤30000)和M(≤1000),分别代表学校的学生总数和俱乐部的个数。后面的M行每行按以下格式给出1个俱乐部的信息,其中学生从1~N编号:

第i个俱乐部的人数Mi(空格)学生1(空格)学生2 … 学生Mi

输出格式:
输出给出一个整数,表示在最大朋友圈中有多少人。

输入样例:
7 4
3 1 2 3
2 1 4
3 5 6 7
1 6
输出样例:
4

二:思路

利用并查集,求得根节点的得数组,再用map<int,int> 来计算当中重复次数多的个数 也就是根节点相同的个数最大值

三:上码


#include<bits/stdc++.h>
using namespace std;

int father[30000]; 

//int find( int x){
//	
//	while( x != father[x] )
//	{
//		x = father[x];
//	}
//		
//	return x;		
//}

//压缩路径
int find(int x){
	int r=x;
    while(father[r]!=r)
    r=father[r];		//找到他的前导结点
    int i=x,j;
    while(i!=r){	//路径压缩算法
        j=father[i];	//记录x的前导结点
        father[i]=r;	//将i的前导结点设置为r根节点
        i=j;
    }
    return r;
} 

void merge(int x,int y)
{
	int a = find(x);//x的根节点为a 
	int b = find(y);//y的根节点为b
	if( a != b )
	father[b] = a;//那么将b的根节点  设为 a 
	 
}

int main()
{
	int N,M;
	cin >> N >> M;
	
	for( int i = 1; i <= N; i++ )
		 father[i] = i;          //设置根节点为数组下标,另外元素值为索引  
		 
	for( int j = 0; j < M; j++ )
	{
		int num;
		cin >> num;
		vector<int>v;
			
		for( int k = 0; k < num; k++ )
		{
			int numPeople;
			cin >> numPeople;
			v.push_back(numPeople);		
		}
			
		for( int i = 0; i < num-1; i++ )
		{
			if( find(v[i]) != find(v[i+1]) )
			 merge(v[i],v[i+1]);//比如刚开始的 1和2 他们原来的根节点不同,所以合并 也就是将索引值为2的数组值改为1  即根节点值为1	
		}	
	
	}
	
	map<int,int>m;
	
	for( int i = 1; i <= N; i++)
	{
		m[find(i)]++;	//这里是find(i)  不能是father[i] 否则最后一个测试点答案错误
	} 
	
	map<int,int>:: iterator t;
	int max = 0;
	
	for(t = m.begin(); t!= m.end(); t++)
	{
		if( max < t->second )
		max = t->second;
	}
	
	cout << max;
			
}



//7 4
//3 1 2 3
//2 1 4
//3 5 6 7
//1 6


// 7 4
// 2 1 4
// 3 5 6 7
// 1 6 
// 3 1 2 3

在这里插入图片描述

四:并查集的相关知识

这道题用到了并查集,所以我就学了一下并查集,所以把自己的见解也分享给大家(建议 先看视频 再浏览 博客 再自己敲一遍 学习效率高而已,我总是乱着来 以为看几篇博客就会了,其实最后还是老老实实 去B站看大佬讲解视频 才搞懂)

1:并查集

查集是一种树型的数据结构,
用于处理一些不相交集合(Disjoint Sets)的合并及查询问题
1:查询元素a和元素b是否属于同一组
2:合并元素a和元素b所在组 (将有相同元素的元素 合并为一个组 )
3:需要初始化一个数组存放父节点,其索引值 代表元素

2:并查集的AC代码(模板`)

/*
 并查集是一种树型的数据结构,
 用于处理一些不相交集合(Disjoint Sets)的合并及查询问题
 
 1:查询元素a和元素b是否属于同一组
 2:合并元素a和元素b所在组 (将有相同元素的元素 合并为一个组 ) 
 3:需要初始化一个数组存放父节点,其索引值  代表元素 
*/

#include<bits/stdc++.h>
using namespace std;
 
int father[100]; 
 

int find( int x){
	
	while( x != father[x] )
	{
		x = father[x];
	}
		
	return x;		
} 

void merge(int x,int y)
{
	int a = find(x);//x的根节点为a 
	int b = find(y);//y的根节点为b
	if( a != b )
	father[b] = a;//那么将b的根节点  设为 a 
	 
}


int main()
{
	//初始化: 我们将每一个结点的前导结点设置为自己,
	//如果在merge函数时未能形成连通,将独立成点
	for( int i = 0; i < 10; i++ )
	{
		father[i] = i;
	}
	
	
}

上方的find函数 效率不高,当处理大数据时,使用并查集查找时,如果查找次数很多,那么使用朴素版的查找方式肯定要超时。比如,有一百万个元素,每次都从第一百万个开始找,这样一次运算就是106,如果程序要求查找个一千万次,这样下来就是1013,肯定要出问题的。

所以有了压缩路径的算法(就是一棵树只有叶节点)

void merge(int x,int y){
    int a=find(x);//x的根节点为a
    int b=find(y);//y的根节点为b
    if(a!=b)//如果a,b不是相同的根节点,则说明ab不是连通的
        pre[a]=b;//我们将ab相连 将a的前导结点设置为b
}

如有疑问 请留言! 加油陌生的你

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: TIA博途软件与S7-1200/1500 PLC应用详解PDF是一本详细介绍TIA博途软件和S7-1200/1500 PLC应用的电子书。TIA博途软件是西门子公司开发的一款用于工业自动化领域的集成开发环境软件,它集成了PLC编程、HMI设计、驱动程序编写等功能,可以实现对工业控制系统的全面开发和管理。 本电子书详细介绍了TIA博途软件的安装与配置、PLC编程语言、HMI界面设计等内容。首先,它介绍了TIA博途软件的安装过程,并指导用户正确配置软件环境,以便能够顺利进行后续工作。 其次,本书详细讲解了S7-1200/1500 PLC的编程语言。这些编程语言包括梯形图、指令列表和结构化文本,读者可以根据实际需要选择适合的编程语言进行工作。通过实例演示和详细的解释,读者可以深入了解PLC编程的要点和技巧。 此外,本书还介绍了HMI界面设计的相关内容。HMI界面是人机交互的重要组成部,本书通过简单易懂的语言和丰富的图例,向读者展示了如何设计醒目而功能强大的HMI界面,以满足用户对工控系统操作体验的需求。 总之,TIA博途软件与S7-1200/1500 PLC应用详解PDF对于使用TIA博途软件和S7-1200/1500 PLC进行工业自动化控制的人员来说是一本宝贵的学习资料。通过学习本书,读者可以全面了解TIA博途软件和S7-1200/1500 PLC的使用方法和应用技巧,提高自己在工业自动化领域的实践能力和解决问题的能力。 ### 回答2: TIATIA博途软件是西门子公司为其S7-1200/1500系列可编程逻辑控制器(PLC)开发的一款工程软件。该软件具有强大的PLC编程和控制功能,可实现工业自动化控制系统的设计、调试和管理。下面将详细介绍TIATIA博途软件与S7-1200/1500PLC的应用。 首先,TIATIA博途软件为工程师提供了友好的可视化编程界面,使得PLC的编程变得简单易懂。它支持多种编程语言,包括梯形图、功能块图和结构化文本等,满足了不同工程需求。此外,TIATIA博途软件还提供了丰富的标准函数库,可快速搭建各种控制逻辑和算法。 其次,TIATIA博途软件具有强大的在线调试和监控功能。通过软件的仿真模式,可以在没有实际硬件设备的情况下进行程序调试,节省了设备和材料成本。一旦PLC与实际设备连接,TIATIA博途软件可以实时监控PLC运行状态、观察输入输出信号和变量值,以及记录历史数据,便于故障诊断和性能优化。 另外,TIATIA博途软件还提供了丰富的通信接口,支持与其他设备和系统的集成。通过以太网、PROFIBUS和PROFINET等通信协议,TIATIA博途软件可以与其他PLC、上位机、触摸屏和远程监控系统等进行数据交换和远程控制,实现系统的全面联网。 总结来说,TIATIA博途软件与S7-1200/1500PLC的应用简化了工业自动化控制系统的设计和调试流程,提高了工程师的编程效率和工作效果。它的强大功能和可靠性使得S7-1200/1500PLC能够广泛应用于各种领域,包括制造业、能源、交通和建筑等。 ### 回答3: 博途软件是西门子(Siemens)公司推出的一套PLC编程和仿真工具,用于开发、配置和管理S7-1200和S7-1500系列PLC。而S7-1200/1500是西门子公司的最新一代可编程逻辑控制器(PLC),具有高性能、高可靠性和开放性的特点。 TIA博途软件与S7-1200/1500PLC的应用详解PDF是一份详细介绍博途软件和S7-1200/1500PLC应用的电子文档。该文档主要包含以下内容: 1. 博途软件的介绍:介绍博途软件的功能和特点,包括编程、仿真、调试、监控和诊断等功能。同时还介绍了博途软件的安装和配置方法。 2. S7-1200/1500PLC的介绍:介绍了S7-1200/1500PLC的硬件特点和技术指标,包括输入输出模块、通信模块、CPU和存储器等组成部。同时还介绍了S7-1200/1500PLC的安装和连接方法。 3. PLC编程:详细介绍了使用博途软件进行PLC编程的方法和技巧,包括基本指令、数据类型、数据传输和数据处理等。同时还介绍了常用的编程语言,如梯形图和结构化文本语言。 4. PLC应用案例:提供了一些实际的PLC应用案例,包括自动化控制、生产线控制、机器人控制和过程控制等。通过这些案例,读者可以了解如何使用博途软件和S7-1200/1500PLC来解决实际的控制问题。 总之,TIA博途软件与S7-1200/1500PLC应用详解PDF是一份全面介绍博途软件和S7-1200/1500PLC的电子文档,对于学习和应用PLC控制技术的工程师和技术人员来说是一份非常有价值的参考资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值