题1
在一个学校里,一开始共有n个学生,而且每个学生都在不同的班级里(即每个班级只有一个人),学校为了节省费用,决定把一些班级进行合并。
每一次合并,学校都可以选择两位同学,接着将这两位同学所在的班级进行合并。
因为学校还要保证某些优秀的同学能够分到一个班,所以合并过后,学校就会询问某两位同学是否在同一班,是则输出Y,否则输出N。
例如,现在有5位同学。
第一次合并,将①同学和②同学所在的班级合并,那么①同学和②同学便在同一班里。
第二次合并,将①同学和③同学所在的班级合并。
因为在这次操作之前,①同学和②同学的班级已经进行合并了,所以②同学和③同学也在一个班级内。
输入格式
第一行为两个数n(1<=n<=100000),m(1<=m<=100000)
接下来的的m行分别是m次操作。格式如下
1 q b
或者是
2 q b (1<=q<=10000,1<=b<=10000)
其中:
1表示的是将q同学所在班级和b同学所在班级进行合并。
2表示的是询问q同学和b同学是否在同一个班,是则输出Y,否则输出N。
输出格式
共x(询问总次数)行
每行一个数,输出Y或N。
输入/输出例子1
输入:
5 4
1 1 2
2 1 2
1 1 3
2 2 3
输出:
Y
Y
样例解释
无
#include<bits/stdc++.h>
using namespace std;
int fa[100005],n,m;
int findroot(int x){
int r=x;
while(fa[r]!=r)
r=fa[r];
while(x!=r){
int t=x;
x=fa[x];
fa[t]=r;
}
return r;
}
void init(){
for(int i=1;i<=n;i++)
fa[i]=i;
}
int main(){
cin>>n>>m;
init();
while(m--){
int k,q,b;
cin>>k>>q>>b;
if(k==1){
int root1=findroot(q);
int root2=findroot(b);
if(root1!=root2){
fa[root1]=root2;
}
}
else{
int root1=findroot(q);
int root2=findroot(b);
if(root1!=root2)
cout<<"N"<<endl;
else
cout<<"Y"<<endl;
}
}
return 0;
}
农夫 John 正在研究他的农场的卫星照片.照片为一个R (1 <=
R <= 75) 行 C (1 <= C <= 75) 列的字符矩阵表示.如下图:
..................

本文介绍了使用并查集解决三个实际问题:班级合并问题,卫星照片中房间和牛群的识别,以及水灾小镇的排水策略。通过并查集的合并与查询操作,实现对各个场景的有效处理,如判断同学是否同班,识别图形的形状,以及确定所需水泵数量。
最低0.47元/天 解锁文章
11万+

被折叠的 条评论
为什么被折叠?



