亲戚
这个题目是一个很标准的并查集,如果不会的话可以先看看这个笔记,我也是看这篇学习的,最好是能理解了,如果理解不了直接当成模板背过也可以,方便后面使用
主要分为三个部分
- 初始化,把每个人都初始化成一个只有自己的集合,
- union,也就是根据题目给的同类的信息进行合并
- find,判断两个人是不是属于同一个集合
我下面这种写法是带路径压缩的,可以很好的缩短寻找时间
package cn.edu.xjtu.daily.April.day_4_11;
import java.util.Scanner;
/**
* https://www.luogu.com.cn/problem/P1551
*/
public class Main {
static int[] relation;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int p = sc.nextInt();
// 初始化
relation = new int[n];
for (int i = 0; i < n; i++) {
relation[i] = i;
}
// 根据题目所给信息合并同类
for (int i = 0; i < m; i++) {
int num1 = sc.nextInt() - 1;
int num2 = sc.nextInt() - 1;
union(num1, num2);
}
// find,查找两个人是不是属于同一个集合
for (int i = 0; i < p; i++) {
int num1 = sc.nextInt() - 1;
int num2 = sc.nextInt() - 1;
if (find(num1) == find(num2)) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
sc.close();
}
/**
* 将两个节点所在集合进行合并
*
* @param x
* @param y
*/
private static void union(int x, int y) {
int xParent = find(x);
int yParent = find(y);
if (xParent > yParent) {
relation[xParent] = yParent;
} else {
relation[yParent] = xParent;
}
}
/**
* 查找给定节点所属集合
*
* @param x
* @return
*/
private static int find(int x) {
return relation[x] == x ? x : (relation[x] = find(relation[x]));
}
}