zoukankan      html  css  js  c++  java
  • 洛谷P3367【模板】并查集

    题目描述

    如题,现在有一个并查集,你需要完成合并和查询操作。

    输入格式

    第一行包含两个整数NM,表示共有N个元素和M个操作。

    接下来M行,每行包含三个整数Zi,Xi,Yi

    当 Zi=1时,将XiYi所在的集合合并。

    Zi=2时,输出XiYi是否在同一集合内,是的输出Y;否则输出N。

    输出格式

    对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N。

     数据范围

    1≤n≤104,1≤m≤2×105

    思路:

    这道题是并查集的模板题。我们只需要维护好并查集的find和union两个基本操作即可(注意要使用路径压缩,一定要确定好每一个集合的代表元素唯一)。

    代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 int father[10001]; 
     5 int m,n,i,x,y,z;
     6 int find(int x){
     7     if(father[x]!=x){
     8         return father[x]=find(father[x]);
     9     }else{
    10         return x;
    11     }
    12 }
    13 void unionn(int r1,int r2){
    14     father[r2]=r1;
    15 }
    16 int main(){
    17     cin>>n>>m;
    18     for(i=1;i<=n;i++){
    19         father[i]=i;
    20     }
    21     for(i=1;i<=m;i++){
    22         cin>>z>>x>>y;
    23         if(z==1){
    24             int r1=find(x);
    25             int r2=find(y);
    26             if(r1!=r2){
    27                 unionn(r1,r2);
    28             }
    29         }else if(z==2){
    30             if(find(x)==find(y)){
    31                 cout<<'Y'<<endl;
    32             }else{
    33                 cout<<'N'<<endl;
    34             }
    35         }
    36     }
    37     return 0;
    38 } 

     

  • 相关阅读:
    如何培养编程所需要的逻辑思维?
    CSS教程
    Android中Service(服务)详解
    Tomcat热部署的实现原理
    Java多线程和线程池(转)
    导出Excel表格
    各种时间格式化的转化
    上传多媒体文件到微信公众平台
    发起https请求并获取结果
    Java 将字节转换为十六进制字符串
  • 原文地址:https://www.cnblogs.com/qianr/p/13379664.html
Copyright © 2011-2022 走看看