zoukankan      html  css  js  c++  java
  • 837. 连通块中点的数量(并查集)

    给定一个包含n个点(编号为1~n)的无向图,初始时图中没有边。

    现在要进行m个操作,操作共有三种:

    1. “C a b”,在点a和点b之间连一条边,a和b可能相等;
    2. “Q1 a b”,询问点a和点b是否在同一个连通块中,a和b可能相等;
    3. “Q2 a”,询问点a所在连通块中点的数量;

    输入格式

    第一行输入整数n和m。

    接下来m行,每行包含一个操作指令,指令为“C a b”,“Q1 a b”或“Q2 a”中的一种。

    输出格式

    对于每个询问指令”Q1 a b”,如果a和b在同一个连通块中,则输出“Yes”,否则输出“No”。

    对于每个询问指令“Q2 a”,输出一个整数表示点a所在连通块中点的数量

    每个结果占一行。

    数据范围

    1n,m1051≤n,m≤105

    输入样例:

    5 5
    C 1 2
    Q1 1 2
    Q2 1
    C 2 5
    Q2 5
    

    输出样例:

    Yes
    2
    3

    代码:
    import java.util.Scanner;
    
    public class Main{
            static int n,m;
            static final int N=100005;
            static int p[]=new int[N];
            static int size[]=new int[N];//存储的是一个集合元素的数量,只有根节点有效
            static int find(int x){
                    if(p[x]!=x) p[x]=find(p[x]);
                    return p[x];
            }
            public static void main(String[] args) {
                    Scanner scan=new Scanner(System.in);
                    n=scan.nextInt();
                    m=scan.nextInt();
                    for(int i=1;i<=n;i++){
                            p[i]=i;
                            size[i]=1;
                    }
                    while(m-->0){
                            String s=scan.next();
                            if(s.equals("C")){
                                    int a=scan.nextInt();
                                    int b=scan.nextInt();
                                    if(find(a)==find(b)) continue;
                                    size[find(b)]+=size[find(a)];//先加上再合并;否则就重复加了
                                    p[find(a)]=find(b);
                            }
                            else if(s.equals("Q1")){
                                    int a=scan.nextInt();
                                    int b=scan.nextInt();
                                    if(find(a)==find(b)) System.out.println("Yes");
                                    else System.out.println("No");
                            }
                            else{
                                    int a=scan.nextInt();
                                    System.out.println(size[find(a)]);
                            }
                    }
            }
    }
  • 相关阅读:
    微信小程序设置控件权重
    从外部浏览开启app
    对rxandroid的简单理解
    react native TextInput
    使用广播来进行刷新页面
    react native中对props和state的理解
    android中四大组件之间相互通信
    android tab选项卡的使用
    android控件 ToggleButton的应用
    Listview的使用
  • 原文地址:https://www.cnblogs.com/qdu-lkc/p/12234593.html
Copyright © 2011-2022 走看看