【洛谷】朋友(并查集,关系网)

本文介绍了一道算法竞赛题目,涉及两个公司的员工通过特定条件配对情侣的问题。利用并查集算法,统计两个公司中与特定人物相连的员工数量,以确定可能的情侣配对数目。

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

题目背景

小明在A公司工作,小红在B公司工作。
题目描述

这两个公司的员工有一个特点:一个公司的员工都是同性。

A公司有N名员工,其中有P对朋友关系。B公司有M名员工,其中有Q对朋友关系。朋友的朋友一定还是朋友。

每对朋友关系用两个整数(Xi,Yi)组成,表示朋友的编号分别为Xi,Yi。男人的编号是正数,女人的编号是负数。小明的编号是1,小红的编号是-1.

大家都知道,小明和小红是朋友,那么,请你写一个程序求出两公司之间,通过小明和小红认识的人最多一共能配成多少对情侣。(包括他们自己)

输入格式

第1行,4个空格隔开的正整数N,M,P,Q。

之后P行,每行两个正整数Xi,Yi。

之后Q行,每行两个负整数Xi,Yi。
输出格式

一行,一个正整数,表示通过小明和小红认识的人最多一共能配成多少对情侣。(包括他们自己)

输入输出样例

输入 #1

4 3 4 2
1 1
1 2
2 3
1 3
-1 -2
-3 -3

输出 #1

2

说明/提示

对于30%数据,N,M<=100,P,Q<=200

对于80%数据,N,M<=4000,P,Q<=10000.

对于全部数据,N,M<=10000,P,Q<=20000。

题解:可以在两个公司分别建立一个关系网,只要和媒婆人物小明,小红在同一个关系网内,就有机会成为情侣,统计A公司和小明在一个关系网的人数,统计B公司和小红在一个关系网的人数(注意:不要将小红和小明当成祖宗,只要小明和小红是同一个祖宗就有机会,说明是亲戚哈哈)

小技巧:B公司虽然用负数表示关系,但是我们可以转化为正数处理

#include<iostream>
#include<cstdio>
using namespace std;
int N,M,P,Q;
int parentA[100005],parentB[1000005];
//并查集 
int findA(int x){
	if(x==parentA[x])return x;
	return parentA[x]=findA(parentA[x]);
}
int findB(int x){
	if(x==parentB[x])return x;
	return parentB[x]=findB(parentB[x]);
}
int main(){
	int man=0,woman=0;
	cin>>N>>M>>P>>Q;
	//初始化A,B关系网 
	for(int i=1;i<=N;i++){
		parentA[i]=i;
	} 
	for(int i=1;i<=M;i++){
		parentB[i]=i;
	}
	//A公司关系网 
	for(int i=1;i<=P;i++){
		int x,y;
		cin>>x>>y;
		parentA[findA(y)]=findA(x);
	}
	
	//B公司关系网
	 for(int i=1;i<=Q;i++){
		int x,y;
		cin>>x>>y;
		x*=-1,y*=-1;
		parentB[findB(y)]=findB(x);
	}	
	//计算和媒婆是亲戚的人数 
	for(int i=1;i<=N;i++){
		if(findA(i)==findA(1))man++;
	}
	for(int i=1;i<=M;i++){
		if(findB(i)==findB(1))woman++;
	}
	cout<<min(man,woman)<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值