并查集-----好忧伤的并查集

菜菜 菜菜     2022-09-23     237

关键词:

 

主要还是看find的join俩个操作,测试数据

1
6
1 2
4 3
1 3
5 6
6 1
7 1

#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;

/**
 * 并查集判断有几个联通子图
 */
const int maxN = 20;
int a[maxN];
int find(int key);
void join(int s, int e);
void _init();
int main()
{
    freopen("d:\3.txt", "r", stdin);
    int c;
    cin >> c;
    int cc = c;
    while (c--)
    {
        cout << "case:" << cc - c << endl;
        int n;
        int s, e;
        cin >> n;
        int maxNode = -1;
        int node[maxN];
        memset(node, 0, sizeof(node));
        _init();
        for (int i = 0; i < n; i++)
        {
            cin >> s >> e;
            node[s] = 1;
            node[e] = 1;
            maxNode = maxNode > s ? maxNode : s;
            maxNode = maxNode > e ? maxNode : e;
            join(s, e);
        }
        int head[maxN];
        int maxP = -1;
        memset(head, 0, sizeof(head));
        int total = 0;
        for (int i = 0; i <= maxNode; i++)
        {
            if (!node[i])
                continue;
            int p = find(i);
            maxP = maxP > p ? maxP : p;
            head[p] = 1;
        }
        for (int i = 0; i <= maxP; i++)
        {
            if (head[i] == 0)
                continue;
            total++;
            cout << "map" << total << " = ";
            for (int j = 0; j <= maxNode; j++)
            {
                if (!node[i])
                    continue;
                int p = find(j);
                if (p == i)
                {
                    cout << " " << j;
                }
            }
            cout << endl;
        }
        cout << "total map=" << total << endl << endl;
    }
    return 0;
}

int find(int key)
{
    return key == a[key] ? key : a[key] = find(a[key]);
}
void join(int s, int e)
{
    int p1 = find(s);
    int p2 = find(e);
    if (p1 != p2)
    {
        if (p1 >= p2)
            a[p1] = p2;
        else
            a[p2] = p1;
    }
}

void _init()
{
    for (int i = 0; i < maxN; i++)
        a[i] = i;
}

有错请评论

并查集

带偏移量的并查集讲解Butterfly AC代码  第二种AC代码1182:食物链  AC代码 查看详情

thesuspects(并查集)

个人心得:最基础的并查集经典题。借此去了解了一下加深版的即加权并查集,比如食物链的题目,这种题目实行起来还是有一定的难度,不仅要找出与父节点的关系,还要在路径压缩的时候进行更新,这一点现在还是没那么上... 查看详情

一道神奇的并查集

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>usingnamespacestd;template<classT>inlinevoidread(T&_a){boolf=0;int_ch=getchar();_a=0;while(_ch<‘ 查看详情

可持久化并查集

可持久化并查集题目链接https://www.luogu.org/problemnew/show/P3402(据说这题暴力随便水)思路首先明确一点,本题考得不是并查集,而是可持久化跟并查集没啥关系。而且在这道题中用不带路径压缩的并查集(欢迎推翻这个flag)然后... 查看详情

杭电1213题解:一道最基础的并查集问题

ProblemDescriptionTodayisIgnatius‘birthday.Heinvitesalotoffriends.Nowit‘sdinnertime.Ignatiuswantstoknowhowmanytablesheneedsatleast.Youhavetonoticethatnotallthefriendsknoweachother,andallthefriendsdono 查看详情

uvalive6910cuttingtree(并查集应用)

...的方法也能做出来。  我第一次使用的是不合并路径的并查集,几乎是一种暴力,花了600多MS,感觉还是不太好的,发现AC的人很多都在300MS之内的过得。  看到他们的做法后,我知道了这个题比较好的做法。  逆向思维的... 查看详情

裸的并查集poj1611thesuspects

http://poj.org/problem?id=1611【Accepted】1#include<iostream>2#include<cstdio>3#include<algorithm>4#include<cstring>5#include<string>6usingnamespacestd;7constintmaxn=3e4+3; 查看详情

几道莫名ac的并查集题

...天还是做(看)差分约束的,但是上不去Vjudge我只能来刷并查集了。%%%静萱大佬把那么多年的noip题都刷遍了,我只能刷水题,noip的题实在是太难了不会啊。 第一道:洛谷P2024食物链 虽然说我很不喜欢看别人代码,但是... 查看详情

algorithmsiv带权重的并查集算法

问题普通的Union-find并查集算法没有加入权重, 可以构造特别的输入使得每次合并的时候高的树HighTree以低的树LowTree的根【root(LowTree)】为新的根, 造成树的不平衡,从而使得效率下降。 用一个新的数组标记节点当前的... 查看详情

uva11987带删除的并查集

...合中3p输出p元素集合的个数及全部元素的和。 题解:并查集。只是并查集中并没有删除的操作。所以就需要将删除的这个点的影响降到0,也就是给删除的点申请一个新的id,以后都是用这个新的id来表示这个点,这样原来的... 查看详情

并查集2——带权并查集

路径压缩前面的并查集的复杂度实际上有些极端情况会很慢。比如树的结构正好是一条链,那么最坏情况下,每次查询的复杂度达到了 O(n)。路径压缩 的思想是,我们只关心每个结点的父结点,而并不太关心树的真正的... 查看详情

加权并查集

 加权并查集是一种特殊的并查集,除可提供查询操作外,还可用于表示元素与其代表元素的关系。下面以食物链为例,讲解一下加权并查集。#include<cstdio>//调用cstdio库,使用getchar函数#include<cctype>//调用cctype库,使... 查看详情

并查集(入门)(代码片段)

首先先看一道很简单的并查集的题目:https://vjudge.net/contest/297398#problem/A这道题就是让你判断两两城镇之间是否联通  如果不联通就要修建一条道路 就我的理解来说,如果单独使用并查集就是为了合并有相同根结点(或者理... 查看详情

uva11987almostunion-find(支持删除操作的并查集)

传送门DescriptionIhopeyouknowthebeautifulUnion-Findstructure.Inthisproblem,you’retoimplementsomethingsimilar,butnotidentical.Thedatastructureyouneedtowriteisalsoacollectionofdisjointsets,supporting 查看详情

有点意思的并查集(代码片段)

K-HowManyAnswersAreWrong HDU-3038题目大意:两个人玩游戏,一个人说一个区间内的数的和,然后判断她说的有多少句和之前说过的冲突的。一开始想的用一个数就代表他到根节点里的数和,但是在路径压缩时明显不对,因为已知[1,8... 查看详情

关于并查集的一切全在这里了(代码片段)

文章目录并查集初识「并查集」常用术语「并查集」基本思想「并查集」的两个实现方式QuickFind方式实现并查集QuickFind工作原理:代码实现与验证时间复杂度QuickUnion方式实现并查集QuickUnion的工作原理为什么QuickUnion比QuickFind... 查看详情

并查集

...算:交、并、补、差,判定一个元素是否属于某一集合。并查集:集合并、查某元素属于哪个集合。并查集问题中集合存储如何实现?1)可以用树结构表示集合,树的每个结点就是集合中的各个元素。2)采用数组的形式进行存... 查看详情

可以删点的并查集

如题。方法一:LCT!细节挺多,略。方法二:如题(废话。。)如果照传统的方法,比如1,2,3在一起要把1删掉,要保证1的爸爸和2,3以后不一样,如果1不是根节点就直接$fa[1]=1$,否则需要改所有的儿子。上面的问题在于删掉... 查看详情