Java实现 蓝桥杯VIP 算法训练 与1连通的点的个数(并查集)

试题 算法训练 与1连通的点的个数

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  没有问题描述。
输入格式
  输入的第一行包含两个整数n, m
  n代表图中的点的个数,m代表边的个数
  接下来m行,每行2个正整数,表示图中连通的两点。
输出格式
  输出1个数,与1连通的点的个数。
样例输入
6 3
1 2
2 3
3 4
样例输出
4
数据规模和约定
  n<=10000,m<=100000。

import java.util.Scanner;

public class Main {
    static int n,m;
    static int[] f;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        f = new int[n+1];
        for(int i = 1;i<=n;i++)
            f[i] = i;
        for(int i = 0;i<m;i++){
            int a = sc.nextInt();
            int b = sc.nextInt();
            join(a,b);
        }
        int x = find(1);
        int count = 0;
        for(int i = 1;i<=n;i++){
            int a = find(i);
            if(a==x)
                count++;
        }
        System.out.println(count);
    }

//查找并赋值
    static int find(int x){
        int r = x;
        while(r!=f[r])
            r = f[r];
        int i=x,j;
        while(i!=r){
            j = f[i];
            f[i] = r;
            i = j;
        }
        return r;
    }
//查找顶级作比较
    static void join(int x,int y){
        int fx = find(x);
        int fy = find(y);
        if(fx!=fy)
            f[fx] = fy;
    }
}
posted @ 2020-04-30 09:09  南墙1  阅读(218)  评论(0编辑  收藏  举报