求助,要哭死了,帮我指出一下哪里还有问题
  • 板块P2078 朋友
  • 楼主Lululu77
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/8/5 20:49
  • 上次更新2023/11/4 11:53:45
查看原帖
求助,要哭死了,帮我指出一下哪里还有问题
518733
Lululu77楼主2021/8/5 20:49
#include<stdio.h>
#include<stdlib.h>
int n,m,p,q,x,y;
int faN[10001],faM[10001],rankN[10001],rankM[10001];
int find(int x)
{
	if(x<0)//女性
	{
		x=abs(x);
		return x==faM[x]?x:(faM[x]=find(-faM[x]));
	}
	else
		return x==faN[x]?x:(faN[x]=find(faN[x]));
}
void merge(int x,int y)
{
	int i,j;
	i=find(x);
	j=find(y);
	if(x<0||y<0)
	{
		if(rankM[i]<rankM[j])
			faM[i]=j;
		else
			faM[j]=i;
		if(rankM[i]==rankM[j]&&i!=j)
		{
			rankM[i]++;
		}
	}
	else
	{
		if(rankN[i]<rankN[j])
			faN[i]=j;
		else
			faN[j]=i;
		if(rankN[i]==rankN[j]&&i!=j)
		{
			rankN[i]++;
		}
	}
}
int main()
{
	int i,man=0,woman=0;
	scanf("%d%d%d%d",&n,&m,&p,&q);
	for(i=1;i<=n;i++)//男员工
	{
		faN[i]=i;
		rankN[i]=1;
	}
	for(i=1;i<=m;i++)
	{
		faM[i]=i;
		rankM[i]=1;
	}
	for(i=0;i<p;i++)
	{
		scanf("%d%d",&x,&y);
		/*if(x<y)
			merge(x,y);
		else if(x>y)
			merge(y,x);*/
		merge(x,y);
	}
	for(i=0;i<q;i++)
	{
		scanf("%d%d",&x,&y);
		/*if(x>y)
			merge(x,y);
		else if(x<y)
			merge(y,x);*/
		merge(x,y);
	}
	x=find(1);//记录1号男员工的根节点
	y=find(-1);//记录-1号女员工的根节点
	for(i=1;i<=n;i++)
	{
		if(faN[i]==x)
			man++;
	}
	for(i=1;i<=m;i++)
	{
		if(faM[i]==y)
			woman++;
	}
	printf("%d\n",man<woman?man:woman);
	return 0;
}
2021/8/5 20:49
加载中...