并查集(图论)

📝 题目:亲戚 (洛谷 P1551)

题目背景

若某个家族人员过于庞大,要判断两个人是否是亲戚,确实不容易。

规定:xy 是亲戚,yz 是亲戚,那么 xz 也是亲戚。也就是亲戚关系具有传递性。

题目描述

给你 n 个人(编号从 1 到 n),m 对亲戚关系,以及 p 个亲戚关系询问。

输入格式

第一行:三个整数 n, m, p。(n,m,p \\le 5000

接下来 m 行:每行两个整数 M_i, M_j,表示 M_iM_j 具有亲戚关系。

接下来 p 行:每行两个整数 P_i, P_j,询问 P_iP_j 是否具有亲戚关系。

输出格式

一共输出 p 行,每行一个 YesNo。表示对于每一个询问的答案。

输入输出样例

输入样例#1:

复制代码
6 5 3
1 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6

输出样例#1:

复制代码
Yes
Yes
No

#include<bits/stdc++.h>
using namespace std;

#define N 5005 // 

int fa[N] = {0};

int find(int x){
    if(fa[x] == x){
        return x;
    }
    else{
        fa[x] = find(fa[x]); 
        return fa[x];
    }
}

void join(int x, int y){
    int fax = find(x);
    int fay = find(y);
    if(fax != fay){ // 
        fa[fax] = fay; 
    }
}

int main(){
    int n, m, p;
  
    while(cin >> n >> m >> p){
        
        for(int i = 1; i <= n; i ++){
            fa[i] = i;
        }
        
        int x, y;
        // 读入关系
        for(int i = 0; i < m; i ++){
            cin >> x >> y;
            join(x, y);
        }
        
        // 查户口
        for(int i = 0; i < p; i ++){
            cin >> x >> y;
            if(find(x) == find(y)){
                cout << "Yes" << endl;
            }
            else{
                cout << "No" << endl;
            }
        }
    }
    return 0;
}

并查集

查看题解查看答案

题目描述

Time Limit: 1000 ms

Memory Limit: 256 mb

如题,现在有一个并查集,你需要完成合并和查询操作。

输入输出格式
输入描述:

第一行包含两个整数 N,M ,表示共有 N 个元素和 M 个操作。 接下来 M 行,每行包含三个整数 Zi,Xi,Yi。 当 Zi=1 时,将 Xi 与 Yi 所在的集合合并。 当 Zi=2 时,输出 Xi 与 Yi 是否在同一集合内,是的输出 Y ;否则输出 N 。 1 <= N <= 10^4 1 <= M <= 2*10^5

输出描述:

对于每一个 Zi =2 的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N 。

输入输出样例
输入样例#:

复制

复制代码
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
输出样例#:

复制

复制代码
N
Y
N
Y
复制代码
#include<bits/stdc++.h>
using namespace std;

#define N 20005
int fa[N] = {0};

int find(int x){
	if(fa[x] == x){
		return x;
	}
	else{
		fa[x] = find(fa[x]);
		return find(fa[x]);
	}
//	while(fa[x] != x){
//		x = fa[x];
//	}
//	return x;
}

void join(int x, int y){
	int fax = find(x);
	int fay = find(y);
	if(fax == fay){
		return;
	}
	else{
		fa[fax] = fay;
		return;
	}
}

int main(){
    int n, m, p;
    while(cin>>n>>m){
  		int x, y, z;
  		for(int i = 1; i <= n; i ++){
  			fa[i] = i;l
		  }
  		for(int i = 0; i < m; i ++){
  			cin>>z>>x>>y;
  			if(z == 1){
  				join(x, y);
			  }
			else{
				if(find(x) == find(y)){
					cout<<"Y"<<endl;
				}
				else{
					cout<<"N"<<endl;
				}
			}
		  }
	}

 

   
}
相关推荐
xiaoye-duck2 小时前
《算法题讲解指南:动态规划算法--路径问题》--7.礼物的最大价值,8.下降路径最小和
c++·算法·动态规划
光影少年2 小时前
react的diff算法和vue的diff算法区别
vue.js·算法·react.js
Queenie_Charlie2 小时前
二分匹配
c++·算法·二分匹配
历程里程碑2 小时前
链表--排序链表
大数据·数据结构·算法·elasticsearch·链表·搜索引擎·排序算法
IT猿手2 小时前
基于动态三维环境下的Q-Learning算法无人机自主避障路径规划研究,MATLAB代码
算法·matlab·无人机·动态路径规划·多无人机动态避障路径规划
美式请加冰2 小时前
栈的介绍和使用(算法)
数据结构·算法·leetcode
不染尘.2 小时前
排序算法详解2
数据结构·c++·算法·排序算法
cm6543202 小时前
C++代码切片分析
开发语言·c++·算法
重生之我是Java开发战士2 小时前
【递归、搜索与回溯】FloodFill算法:图像渲染,岛屿数量,岛屿的最大面积,被围绕的区域,太平洋大西洋水流问题,扫雷游戏,衣橱整理
算法·leetcode·深度优先