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];
    }
}

posted @ 2020-04-30 11:36  南墙1  阅读(113)  评论(0编辑  收藏  举报