20pts求调!!!注释非常明白,变量名非常明白!!!
  • 板块P2078 朋友
  • 楼主NFCcod
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/14 09:23
  • 上次更新2024/7/14 10:40:54
查看原帖
20pts求调!!!注释非常明白,变量名非常明白!!!
1369888
NFCcod楼主2024/7/14 09:23
#include<bits/stdc++.h>
using namespace std;
//数组大小
const short ArrSize=2e4+10; 
//题目给定数据
short n,m;
short p,q; 
//并查集
short ManFriend[ArrSize];
short WomanFriend[ArrSize];
//每个并查集中和小明和小红有关系的人的数量
short XiaomingFriend=0,XiaohongFriend=0; 
short InputTmp1,InputTmp2;

//查找根节点变量
int FindManRoot(short Node){
	//如果某元素的父是他自己,找到了根,否则继续寻找 
	if(ManFriend[Node]==Node) return Node;
	//路径压缩,找到 Node的根之后,让Node的父直接指向Node的根 
	else return ManFriend[Node]=FindManRoot(ManFriend[Node]);
}
int FindWomanRoot(short Node){
	if(WomanFriend[Node]==Node) return Node;
	else return WomanFriend[Node]=FindWomanRoot(WomanFriend[Node]);
}

int main(){
	//输入
	cin>>n>>m>>p>>q;
	//初始化
	for(int i=1;i<=n;i++) ManFriend[i]=i;	
	//输入盆友关系
	for(int i=1;i<=p;i++){
		//输入辅助变量
		cin>>InputTmp1>>InputTmp2;
		ManFriend[InputTmp2]=InputTmp1;
	} 	
	//查找根节点,计数共有多少个盆友 
	for(int i=1;i<=n;i++)FindManRoot(ManFriend[i]);
	for(int i=1;i<=n;i++)
		if(ManFriend[i]==1)	XiaomingFriend++;
	
	//同样处理小红的公司	
	for(int j=1;j<=m;j++) WomanFriend[j]=j;
	for(int j=1;j<=q;j++){
		cin>>InputTmp1>>InputTmp2;
		InputTmp1=-InputTmp1;
		InputTmp2=-InputTmp2;
		WomanFriend[InputTmp2]=InputTmp1;
	} 
	
	for(int j=1;j<=m;j++)FindWomanRoot(WomanFriend[j]);
	for(int j=1;j<=m;j++)
		if(WomanFriend[j]==1)XiaohongFriend++;
	
	//输出结果(朋友最少的那个人(小明或小红))
	if(XiaomingFriend>=XiaohongFriend)
		cout<<XiaohongFriend;
	else
		cout<<XiaomingFriend;
	 
	return 0;
}
2024/7/14 09:23
加载中...