首页 > 编程语言 >算法刷题笔记--并查集的运用

算法刷题笔记--并查集的运用

时间:2023-07-26 13:03:14浏览次数:30  
标签:-- 查集 father cin 信息 int include find 刷题

1、题目描述:

一个城市中有两个犯罪团伙A和B,你需要帮助警察判断任意两起案件是否是同一个犯罪团伙所为,警察所获得的信息是有限的。假设现在有N起案件(N<=100000),编号为1到N,每起案件由团伙A或团伙B所为。你将按时间顺序获得M条信息(M<=100000),这些信息分为两类:

  1. D [a] [b]

其中[a]和[b]表示两起案件的编号,这条信息表明它们属于不同的团伙所为。

  1. A [a] [b]

其中[a]和[b]表示两起案件的编号,这条信息需要你回答[a]和[b]是否是同一个团伙所为。

注意你获得信息的时间是有先后顺序的,在回答的时候只能根据已经接收到的信息做出判断。

输入描述:

第一行是测试数据的数量T(1<=T<=20)。

每组测试数据的第一行包括两个数N和M,分别表示案件的数量和信息的数量,其后M行表示按时间顺序收到的M条信息。

输出描述:

对于每条需要回答的信息,你需要输出一行答案。如果是同一个团伙所为,回答"In the same gang.",如果不是,回答"In different gangs.",如果不确定,回答”Not sure yet."。

样例输入:

样例输出:

1

5 5

A 1 2

D 1 2

A 1 2

D 2 4

A 1 4

2、代码实现

#include<iostream>
#include<set>
#include<vector>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=100005;
int father[N*2];
int find(int x)
{
	if(x!=father[x]) 
		father[x]= find(father[x]);
	return father[x];
}
void unionSet(int x,int y)
{
//	int fx=find(x);
//	int fy=find(y);
//	if(fx!=fy)
//	{
//		father[fy]=fx;
//	}
	father[find(y)]=find(x);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin.tie(0);
	
	int t,n,m;
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		for(int i=1;i<=n*2+1;i++)
		{
			father[i]=i;
		}
		string op;
		int a,b;
		while(m--)
		{
			cin>>op>>a>>b;
			if(op=="D")
			{
				unionSet(a,b+n);
				unionSet(a+n,b);
			}else
			{
				int fa=find(a);
				int fb=find(b);
				if(fa==fb)
				{
					cout<<"In the same gang."<<endl;
				}else if(fa==find(b+n) || fb==find(a+n))
				{
					cout<<"In different gangs."<<endl;
				}else
				{
					cout<<"Not sure yet."<<endl;
				}
			}
		}
	}
    return 0;
}

标签:--,查集,father,cin,信息,int,include,find,刷题
From: https://blog.51cto.com/u_16200991/6855258

相关文章

  • Amazon 4.7 星评,领域新经典,了解服务设计就读它
    2011年,AdaptivePath公司的BrandonSchauer粗略估算,美国每年在服务的规划和设计上大约花费20亿美元,但其中仅有7000万美元(大约3.5%)花在了“服务设计”上。做另外96.5%的工作的那些人,从不觉得自己是服务设计师,甚至从没听说过“服务设计”这个词。划重点:很多人,还不知道自己......
  • 又一本经典全面升级 豆瓣 8.5,搞透 Kafka 就看它了
    科学家们每一次发生分歧都是因为掌握的数据不够充分。所以,我们可以先就获取哪一类数据达成一致,只要获取了数据,问题也就迎刃而解了。要么我是对的,要么你是对的,要么我们都是错的,然后继续。——NeildeGrasseTyson每个应用程序都会生成数据,包括日志、指标、用户活动记录、响应消息等,......
  • 基于微信小程序的校园设备报修平台的设计与实现-计算机毕业设计源码+LW文档
    【摘要】随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具。在高校,各种管理系统层出不穷,为校园设备报修管理开发必要的系统,能够有效的提升管理效率。一直以来,校园设备报修一直没有进行系统化的管理,学生无法快速进行报修,由此提出开发基......
  • 一次性打包学透 Spring
    不知从何时开始,Spring这个词开始频繁地出现在Java服务端开发者的日常工作中,很多Java开发者从工作的第一天开始就在使用SpringFramework,甚至有人调侃“不会Spring都不好意思自称是个Java开发者”。之所以出现这种局面,源于Spring是一个极为优秀的一站式集成框架,对Java......
  • 如何实现在web浏览器播放H.265编码视频?网页全终端安防视频流媒体播放器
    目前安防监控行业,基本所有的摄像头都支持H264编码,但是已经有部分摄像头开始支持H265,并且支持H265的摄像机已经越来越多。H265相比H264有着很多优势,压缩更高,网络传输消耗的带宽更小,相同码率下H265视频更清晰。H264目前已经可以在各种web浏览器、客户端等进行解码播放,但是目前H.265编......
  • 测试1
    title:list:<%_.forEach(people,function(name){%><li><%=name%></li><%});%>people:-JonSchlinkert-BrianWoodward---title:list:<%_.forEach(people,function(name){%><li><%=name%></li>......
  • 伪代码中ties broken arbitrarily是什么含义?
    最近在看一个物联网的论文,论文的伪代码中有这么一个地方标有:tiesbrokenarbitrarily,对这个写法有些搞不清楚含义,于是网上找到了下面的资料:https://www.zhihu.com/question/480782518  该帖子中给出的Demo如下:   关键地方:    根据原帖子中的解释,个人理解......
  • 大怨种的pwn的wp
    0x01pwnable_echo1军训几天加暑假的活frompwnimport*context(os='linux',arch='amd64',log_level='debug')#context(os='linux',arch='amd64')p=process('./l3')elf=ELF('./l3')libc=ELF(......
  • docker底层实现
    目录1、基本架构2、名字空间2.1pid名字空间2.2net名字空间2.3ipc名字空间2.4mnt名字空间2.5uts名字空间2.6user名字空间3、控制组4、联合文件系统5、容器格式6、Docker网络实现6.1基本原理6.2创建网络参数6.3网络配置细节(1)基本架构(2)名字空间•pid名字空间......
  • 独奏者2 序章的wp
    0x010ctf_2017_babyheap2023.7.24国防科技大学合肥本题除了fastbinattack,最重要的是伪造fakechunk,使得存放chunk的指针有两个指向同一个地址,达到泄露地址的目的。突然发现自己之前写过一模一样的题,当时是照着别人的方法写的堆重叠(这次也有借鉴其实……)。这个方法我愿意......