zoukankan      html  css  js  c++  java
  • [Codeforces 920E]Connected Components?

    Description

    题库链接

    给你一个 (n) 个点 (m) 条边的无向图,求其补图的连通块个数及各个连通块大小。

    (1leq n,mleq 200000)

    Solution

    参考了 ww140142 的做法。题解也转自该博客。

    每次枚举一个未处理过的点,然后从它开始宽搜出它所在的连通块;

    具体是枚举它的所有原图的边,标记起来,枚举边之后再枚举所有的点,将未标记的点加入该连通块,并加入队列继续宽搜;

    为了节约无用的枚举,我们还需要对所有点构建链表,将已经在某个块内的点删除;

    这个算法的复杂度是 (O(n+m)) 的;

    原因是每一个点仅进行了一次宽搜的拓展;

    并且在每次拓展中,枚举边表总复杂度是 (O(m))

    而之后的枚举剩下的点,我们将点分为两部分:已标记的点的复杂度计在 (O(m)) 之内,而未标记的点将会被加入队列,这个过程对每个点也仅有一次。

    综上复杂度为 (O(n+m))

    Code

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 200000;
    
    int n, m, u, v;
    vector<int>to[N+5];
    queue<int>Q;
    int lst[N+5], nxt[N+5], ans[N+5], cnt;
    int vis[N+5], undo[N+5];
    
    void delet(int x) {nxt[lst[x]] = nxt[x], lst[nxt[x]] = lst[x]; }
    void work() {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= m; i++)
        scanf("%d%d", &u, &v), to[u].push_back(v), to[v].push_back(u);
        for (int i = 1; i < n; i++) nxt[i] = i+1, lst[i+1] = i;
        nxt[0] = 1;
        for (int i = 1; i <= n; i++)
        if (vis[i] == 0) {
            ans[++cnt] = 1;
            vis[i] = 1, Q.push(i); delet(i);
            while (!Q.empty()) {
            u = Q.front(); Q.pop();
            for (int j = 0, sz = to[u].size(); j < sz; j++)
                if (vis[to[u][j]] == 0) undo[to[u][j]] = 1;
            for (int j = nxt[0]; j; j = nxt[j])
                if (undo[j] == 0) {vis[j] = 1, ++ans[cnt]; delet(j); Q.push(j); }
                else undo[j] = 0;
            }
        }
        sort(ans+1, ans+cnt+1); printf("%d
    ", cnt);
        for (int i = 1; i <= cnt; i++) printf("%d ", ans[i]);
    }
    int main() {work(); return 0; }
  • 相关阅读:
    [Micropython]发光二极管制作炫彩跑马灯
    如何在MicroPython TPYBoard 添加自定义类库
    micropython TPYBoard v202 超声波测距
    简易排水简车的制作 TurnipBit 系列教程
    TPYBoard v102 驱动28BYJ-48步进电机
    使用mksdcard管理虚拟SD卡
    使用 DX 编译 Android应用
    常用ADB的用法
    在命令行创建、删除和浏览AVD、使用android模拟器
    Android-SDK下目录结构
  • 原文地址:https://www.cnblogs.com/NaVi-Awson/p/8682506.html
Copyright © 2011-2022 走看看