首页 > 其他分享 >并查集

并查集

时间:2023-02-05 00:12:04浏览次数:57  
标签:std DSU return int siz 查集 leader

ATC(ABC287C Path Graph?)

#include <bits/stdc++.h>

using namespace std;

struct DSU {
    vector<int> f, siz;
    DSU(int n) : f(n), siz(n, 1) { iota(f.begin(), f.end(), 0); }
    int leader(int x) {
        while (x != f[x]) x = f[x] = f[f[x]];
        return x;
    }
    bool same(int x, int y) { return leader(x) == leader(y); }
    bool merge(int x, int y) {
        x = leader(x);
        y = leader(y);
        if (x == y) return false;
        siz[x] += siz[y];
        f[y] = x;
        return true;
    }
    int size(int x) { return siz[leader(x)]; }
};


int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int N, M;
    cin >> N >> M;
    
    if (M != N - 1) {
        cout << "No\n";
        return 0;
    }
    
    vector<int> deg(N);
    DSU dsu(N);
    for (int i = 0; i < M; i++) {
        int u, v;
        cin >> u >> v;
        // u--, v--;
        deg[u]++, deg[v]++;
        dsu.merge(u, v);
    }
    for (int i = 0; i < N; i++) {
        if (deg[i] > 2) {
            cout << "No\n";
            return 0;
        }
        if (!dsu.same(i, 0)) { // 如果不连通
            cout << "No\n";
            return 0;
        }
    }
    cout << "Yes\n";
    
    return 0;
}

ATC(ABC288C Don't be cycle)

#include <bits/stdc++.h>

using namespace std;

struct DSU {
    std::vector<int> f, siz;
    DSU(int n) : f(n), siz(n, 1) { std::iota(f.begin(), f.end(), 0); }
    int leader(int x) {
        while (x != f[x]) x = f[x] = f[f[x]];
        return x;
    }
    bool same(int x, int y) { return leader(x) == leader(y); }
    bool merge(int x, int y) {
        x = leader(x);
        y = leader(y);
        if (x == y) return false;
        siz[x] += siz[y];
        f[y] = x;
        return true;
    }
    int size(int x) { return siz[leader(x)]; }
};

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int n, m;
    std::cin >> n >> m;
    int comp = n;
    DSU dsu(n);
    for (int i = 0; i < m; i++) {
        int u, v;
        std::cin >> u >> v;
        u--, v--;
        comp -= dsu.merge(u, v); // comp:连通块数
    }
    std::cout << m - (n - comp) << "\n";
    
    return 0;
}

标签:std,DSU,return,int,siz,查集,leader
From: https://www.cnblogs.com/LHgogo/p/17092686.html

相关文章

  • 并查集
    并查集属于图的知识,一般应用于给出几组关系,来判断谁和谁是一个团队的。先来看一个实例,​​杭电1232畅通工程​​ 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告......
  • POJ 2492 A Bug's Life(并查集)
    DescriptionBackgroundProfessorHopperisresearchingthesexualbehaviorofararespeciesofbugs.Heassumesthattheyfeaturetwodifferentgendersandthat......
  • POJ 1182 食物链(并查集)
    Description动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是......
  • ZOJ 3261 Connections in Galaxy War (并查集+离线处理)
    Description:Inordertostrengthenthedefenseability,manystarsingalaxyalliedtogetherandbuiltmanybidirectionaltunnelstoexchangemessages.However,......
  • POJ 1733 Parity game (路径压缩并查集+离散化)
    DescriptionNowandthenyouplaythefollowinggamewithyourfriend.Yourfriendwritesdownasequenceconsistingofzeroesandones.Youchooseacontinuous......
  • POJ 2253 Frogger(并查集+二分||Dijkstra)
    DescriptionFreddyFrogissittingonastoneinthemiddleofalake.SuddenlyhenoticesFionaFrogwhoissittingonanotherstone.Heplanstovisither,but......
  • POJ 1456 Supermarket (贪心+并查集优化)
    DescriptionAsupermarkethasasetProdofproductsonsale.Itearnsaprofitpxforeachproductx∈Prodsoldbyadeadlinedxthatismeasuredasanintegral......
  • 数据结构——并查集
    一、并查集的概念在计算机科学中,并查集是一种树形的数据结构,用于处理不交集的合并(union)及查询(find)问题。 并查集可用于查询网络中两个节点的状态,这里的网络是......
  • 【新生寒训】day 24 并查集 ST表与RMQ
    【新生寒训】day24并查集ST表与RMQ记得看看这个( ̄▽ ̄)"一些方法论:https://www.cnblogs.com/CTing/p/17067404.html今日小题https://atcoder.jp/contests/abc132/tasks/......
  • POJ--1182 食物链(并查集)
    记录15:392023-1-26http://poj.org/problem?id=1182reference:《挑战程序设计竞赛(第2版)》2.4.4p88Description动物王国中有三类动物A,B,C,这三类动物的食物链构成......