华师一附中OI组
标题:
P3367 【模板】并查集
[打印本页]
作者:
admin
时间:
2018-7-27 22:42
标题:
P3367 【模板】并查集
https://www.luogu.org/problemnew/show/P3367
题目描述
如题,现在有一个并查集,你需要完成合并和查询操作。
输入输出格式
输入格式:
第一行包含两个整数N、M,表示共有N个元素和M个操作。
接下来M行,每行包含三个整数Zi、Xi、Yi
当Zi=1时,将Xi与Yi所在的集合合并
当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输出N
输出格式:
如上,对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N
输入输出样例
输入样例#1:
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
输出样例#1:
N
Y
N
Y
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据,N<=10,M<=20;
对于70%的数据,N<=100,M<=1000;
对于100%的数据,N<=10000,M<=200000。
作者:
zhwang
时间:
2018-7-27 23:16
#include<cstdio>
int n,m,z,x,y;
int f[10000+100];
int getf(int child)
{
if(f[child]==child)
{
return child;
}
else
{
f[child]=getf(f[child]);
return f[child];
}
}
void merge(int father,int son)
{
int t1=getf(father);
int t2=getf(son);
if(t1!=t2)
{
f[t2]=t1;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
f[i]=i;
}
for(int i=1;i<=m;i++)
{
scanf("%d",&z);
if(z==1)
{
scanf("%d%d",&x,&y);
merge(x,y);
}
if(z==2)
{
scanf("%d%d",&x,&y);
if(getf(f[x])==getf(f[y]))
{
printf("Y\n");
}
else
{
printf("N\n");
}
}
}
return 0;
}
复制代码
作者:
吴语林
时间:
2018-7-28 07:44
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
using namespace std;
int n,t,o,x,y,fa[11000];
int getf(int u)
{
if( u == fa[u] )
return u;
int f = getf(fa[u]);
fa[u] = f;
return f;
}
int main()
{
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++)
fa[i]=i;
while(t--)
{
scanf("%d%d%d",&o,&x,&y);
int f1=getf(x),f2=getf(y);
if(o==1)
{
if( f1 != f2 )
fa[f1]=f2;
}
else
{
if(f1==f2)
printf("Y\n");
else
printf("N\n");
}
}
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-7-28 08:22
本帖最后由 黄煦喆 于 2018-7-28 09:09 编辑
#include<iostream>
using namespace std;
int n,m;
int par[10001];
int getp(int p)
{
while(par[p]!=par[par[p]])par[p]=par[par[p]];
return par[p];
}
void merge(int a,int b)
{
int r1=getp(a);
int r2=getp(b);
if(r1==r2)return;
else par[r1]=r2;
}
void query(int a,int b)
{
int r1=getp(a);
int r2=getp(b);
if(r1==r2)cout<<"Y"<<endl;
else cout<<"N"<<endl;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)par[i]=i;
int z,x,y;
for(int i=1;i<=m;i++)
{
cin>>z>>x>>y;
if(z==1)merge(x,y);
else if(z==2)query(x,y);
}
return 0;
}
复制代码
作者:
Chris_hhs
时间:
2018-7-29 17:51
#include<iostream>
using namespace std;
const int maxn=100000+2;
int fa[maxn];
int n,m;
int x,y,z;
int find(int x)
{
if(fa[x]!=x) fa[x]=find(fa[x]);
return fa[x];
}
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++) fa[i]=i;
while(m--)
{
cin>>z>>x>>y;
if(z==1)
{
int r1,r2;
r1=find(x);
r2=find(y);
fa[r1]=r2;
}
if(z==2)
{
if(find(x)==find(y)) cout<<"Y";
else cout<<"N";
cout<<endl;
}
}
return 0;
}
复制代码
作者:
walk_alone
时间:
2018-7-29 19:05
#include <cstdio>
int father[10001];
int findfather(int x)
{
if(father[x]==x)
return x;
father[x]=findfather(father[x]);
return father[x];
}
int main()
{
int n,m,z,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
father[i]=i;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&z,&x,&y);
if(z==1)
father[findfather(x)]=findfather(y);
if(z==2)
{
if(findfather(x)==findfather(y))
printf("Y\n");
else
printf("N\n");
}
}
return 0;
}
复制代码
作者:
张笑宇
时间:
2018-7-30 09:32
#include<iostream>
using namespace std;
const int mx=10010;
int par[mx],i,n,m;
int getpar(int a)
{///找根节点
if (par[a]!=a)
par[a]=getpar(par[a]);
return par[a];
}
int query(int a,int b)
{///查询a,b是否在同一个集合
return getpar(a)==getpar(b);
}
void merge_(int a,int b)
{///合并a,b所在集合
par[getpar(a)]=getpar(b);
return;
}
int main()
{
cin>>n>>m;
for (i=1;i<=n;i++) par[i]=i;
for (int im=1;im<=m;im++)
{
int x,a,b;
cin>>x>>a>>b;
if (x==1)
merge_(a,b);
if (x==2)
{
int bb=query(a,b);
if (bb==1) cout<<"Y"<<endl;
if (bb==0) cout<<"N"<<endl;
}
}
return 0;
}
复制代码
作者:
Scorpio
时间:
2018-7-31 11:51
#include<iostream>
using namespace std;
int f[10500];
int n,m,i,z,x,y;
int findhhh(int x)
{
int r=x,i=x,j;
while(f[r]!=r)
r=f[r];
while(i!=r)
{
j=f[i];
f[i]=r;
i=j;
}
return r;
}
void join(int x,int y)
{
int fx,fy;
fx=findhhh(x);
fy=findhhh(y);
if(fx!=fy)
f[fx]=fy;
}
string findxy(int x,int y)
{
int fx,fy;
fx=findhhh(x);
fy=findhhh(y);
if(fx==fy)
return "Y";
else
return "N";
}
int main()
{
cin>>n>>m;
for(i=1;i<=10500;i++)
f[i]=i;
for(i=1;i<=m;i++)
{
cin>>z>>x>>y;
if(z==1)
join(x,y);
else
cout<<findxy(x,y)<<endl;
}
return 0;
}
复制代码
作者:
ZMQ
时间:
2018-8-6 21:58
提示:
作者被禁止或删除 内容自动屏蔽
作者:
倚窗倾听风吹雨
时间:
2018-9-19 19:09
#include<iostream>
using namespace std;
const int N=10010;
int a[N],n,m,x,y,z;
int getf(int q)
{
if(a[q]==q)return q;
a[q]=getf(a[q]);
return a[q];
}
void merge2(int q,int w)
{
int t1,t2;
t1=getf(q);
t2=getf(w);
if(t1!=t2)
a[t2]=t1;
return;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)a[i]=i;
for(int i=1;i<=m;i++)
{
cin>>z>>x>>y;
if(z==1)merge2(x,y);
if(z==2)
if(getf(x)==getf(y))cout<<'Y'<<endl;
else cout<<'N'<<endl;
}
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2