0分求助
查看原帖
0分求助
363669
hwwqy楼主2021/6/3 23:26

本来刚学并查集想练练手
结果0...
此题不能用并查集吗?
样例在本机上已经AC

#include<bits/stdc++.h>
using namespace std;
const int MAX_N=12000;
int par[MAX_N],rank[MAX_N];
void init(int n)
{
	for(int i=0;i<n;i++)
	{
		par[i]=i;
		rank[i]=0;
	}
}
int find(int x)
{
	if(par[x]==x)
	{
		return x;
	}	
	else return par[x]=find(par[x]);
}
void untie(int x,int y)
{
	x=find(x);
	y=find(y);
	if(x==y)return ;
	if(rank[x]<rank[y]){
		par[x]=y;
	}
	else{
		par[y]=x;
		if(rank[x]==rank[y])rank[x]++;
	}
}
void tie(int x,int y)
{
	int X,Y;
	X=find(x);
	Y=find(y);
	//找根 
	if(X!=Y)return ;
	if(rank[x]<rank[y]){
		par[x]=x;
	}
	else{
		par[y]=y;
		if(rank[x]==rank[y])rank[x]--;
	}
}
bool same(int x,int y){
	return find(x)==find(y);
}
int n,m,c1,c2;
string cmd;
int main()
{
	scanf("%d%d",&n,&m);
	init(n);
	for(int i=1;i<=m;i++){
		cin>>cmd;
		scanf("%d%d",&c1,&c2);
		if(cmd=="Query"){
			if(same(c1,c2))printf("Yes\n");
			else printf("No\n");
		}
		else if(cmd=="Connect")untie(c1,c2);
		else tie(c1,c2);
	}
	return 0;
}
2021/6/3 23:26
加载中...