uva 11987 Almost Union-Find

简介: 点击打开链接uva 11987 思路: 并查集 分析: 1 题目给定三种操作,符合并查集的模式 2 但是有一种操作和普通的并查集不同的是,2 p q要把p并到q的集合,那么这个时候p所在的集合就会发生变化,如果p刚好是它那个集合的跟节点那么这个时候就要重新调整这个集合 3 那么我们为了避免这种删除跟节点的情况出现,我们就把所有的i~n的节点的跟节点指向i+n,这样保证了删除的时候肯定不会是根节点。

点击打开链接uva 11987

思路: 并查集
分析:
1 题目给定三种操作,符合并查集的模式
2 但是有一种操作和普通的并查集不同的是,2 p q要把p并到q的集合,那么这个时候p所在的集合就会发生变化,如果p刚好是它那个集合的跟节点那么这个时候就要重新调整这个集合
3 那么我们为了避免这种删除跟节点的情况出现,我们就把所有的i~n的节点的跟节点指向i+n,这样保证了删除的时候肯定不会是根节点。这样就变成了简单的并查集问题了

代码:

#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 100010;

int n , m;
int father[MAXN];
int sum[MAXN] , num[MAXN];

void init(){
    for(int i = 1 ; i <= n ; i++){
        father[i] = i+n;
        father[i+n] = i+n;
        sum[i+n] = i;
        num[i+n] = 1;
    }
}

int find(int x){
    if(father[x] != x)
        father[x] = find(father[x]);
    return father[x];
}

int main(){
    int mark , x , y;
    while(scanf("%d%d" , &n , &m) != EOF){
         init();
         for(int i = 0 ; i < m ; i++){
             scanf("%d" , &mark);
             if(mark == 1){
                scanf("%d%d" , &x , &y);
                int fx = find(x);
                int fy = find(y);
                if(fx != fy){
                    father[fx] = fy;
                    sum[fy] += sum[fx];
                    num[fy] += num[fx];
                }
             }        
             else if(mark == 2){
                scanf("%d%d" , &x , &y);
                int fx = find(x);
                int fy = find(y);
                if(fx != fy){
                   father[x] = fy;
                   sum[fy] += x;
                   sum[fx] -= x;
                   num[fy] ++;
                   num[fx] --;
                }
             }
             else{
                 scanf("%d" , &x);
                 int fx = find(x);
                 printf("%d %d\n" , num[fx] , sum[fx]);
             }
         }
    }
    return 0;
}

目录
相关文章
|
8月前
|
存储 机器学习/深度学习 算法
并查集(Union Find)
并查集(Union Find)
69 3
|
8月前
|
存储
并查集Union-find Sets
并查集Union-find Sets
42 0
|
机器人 Python
并查集(Union-Find)
并查集(Union-Find)是一种用于解决动态连通性问题的数据结构,它主要用于处理不相交的集合(Disjoint Sets)之间的合并和查询操作。并查集的主要优点是,它不需要比较相邻的元素,而是通过分配和收集元素来进行操作,从而在处理大量数据时非常高效。
76 8
UVa11076 - Add Again
UVa11076 - Add Again
59 0
|
人工智能 BI
UVa1554 - Binary Search
UVa1554 - Binary Search
52 0
|
机器学习/深度学习 网络架构
PTA 1164-1167 Good in C/Block Reversing/Summit/Cartesian Tree(一)
PTA 1164-1167 Good in C/Block Reversing/Summit/Cartesian Tree
108 0
PTA 1164-1167 Good in C/Block Reversing/Summit/Cartesian Tree(一)
|
机器学习/深度学习 网络架构
PTA 1164-1167 Good in C/Block Reversing/Summit/Cartesian Tree(二)
PTA 1164-1167 Good in C/Block Reversing/Summit/Cartesian Tree
127 0
|
机器学习/深度学习 Java
HDOJ 2095 find your present (2)
HDOJ 2095 find your present (2)
114 0
HDOJ 2095 find your present (2)
|
算法 JavaScript Java
并查集算法 - Algorithms, Part I, week 1 UNION-FIND
cousera 普林斯顿大学 算法公开课 第一周 并查集数据类型内容整理
1520 0
|
存储 C++ 编译器
union介绍,union与struct
转自:https://www.cnblogs.com/jeakeven/p/5113508.html   union介绍 共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。
1290 0