Java实现 蓝桥杯VIP 算法训练 连通分块(并查集)
试题 算法训练 连通分块
资源限制
时间限制:200ms 内存限制:8.0MB
问题描述
连通分块
输入格式
输入的第一行包含两个整数n, m
n代表图中的点的个数,m代表边的个数
接下来m行,每行2个正整数,表示图中连通的两点。
输出格式
输出1行,与1连通的点的集合,并按升序排列输出。
样例输入
6 3
1 2
2 3
3 4
样例输出
1 2 3 4
数据规模和约定
n<=10000,m<=100000
package 蓝桥杯官网;
import java.util.Scanner;
public class 连通分块 {
//https://blog.csdn.net/a1439775520/article/details/90746562 欢迎进入讨论群
public static int[] f;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
f = new int[n + 1];
int x, y;
for (int i = 1; i <= n; i++) {
f[i] = i;
}
for (int i = 0; i < m; i++) {
x = sc.nextInt();
y = sc.nextInt();
setinfo(x, y);
}
for (int i = 1; i <= n; i++) {
if (f[i] == 1) System.out.print(i + " ");
}
}
public static void setinfo(int a, int b) {
int fa = find(a);
int fb = find(b);
if (fa > fb) {
f[fa] = fb;
} else {
f[fb] = fa;
}
}
public static int find(int num) {
if (num != f[num]) {
int temp = find(f[num]);
f[num] = temp;
}
return f[num];
}
}