看原题左转哈!
先定变量
int n,m,f[11451];
int fx=find(x),fy=find(y);//find函数后面说
int temp,x,y;
由题可知,要输入n和m为先
cin>>n>>m;
然后,就是并查集中的基本初始化,将自己定义为自己的父亲结点
for(int i=1;i<=n;i++){
f[i]=i;
}
这时,该输入,,(其实就是前面定义变量中的temp,x,y)
for(int i=1;i<=m;i++){
cin>>temp>>x>>y;
}
之后,进行判断为1还是为2,以及判断关系输出
for(int i=1;i<=m;i++){
cin>>temp>>x>>y;
if(temp==1){
merge(x,y);
}else{
if(find(x)==find(y)){
cout<<"Y"<<endl;
}else{
cout<<"N"<<endl;
}
}
}
好,现在正式步入正题
find函数(用来查询祖先的,看最上层的结点是哪个)
int find(int x){
if(f[x]==x){
return x;
}
return find(f[x]);
}//查询祖先
then
merge函数(将有关系的结点合并在一起)
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy){
f[fx]=fy;
}
}//合并祖先
最终,组合代码
#include<iostream>
using namespace std;
int n,m,f[10001];
int temp,x,y;//指令,判断是1是2
int find(int x){
if(f[x]==x){
return x;
}
return find(f[x]);
}//查询祖先
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy){
f[fx]=fy;
}
}//合并祖先
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
f[i]=i;
}
for(int i=1;i<=m;i++){
cin>>temp>>x>>y;
if(temp==1){
merge(x,y);
}else{
if(find(x)==find(y)){
cout<<"Y"<<endl;
}else{
cout<<"N"<<endl;
}
}
}
return 0;
}
好,测试!
额。。。。。。。。
那就优化一下!
int find(int x){
if(f[x]==x){
return x;
}
return f[x]=find(f[x]); //原本为return find(f[x]);
}//查询祖先
again?
诶嘿,开溜