本来刚学并查集想练练手
结果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;
}