首页 > 其他分享 >P3469 [POI2008]BLO-Blockade 割点,强联通分量

P3469 [POI2008]BLO-Blockade 割点,强联通分量

时间:2023-01-10 17:58:08浏览次数:41  
标签:sz POI2008 int 割点 dfs Blockade dfn low id

 


 

 

 

// 题意:对于每一个点,求删去这个点的所有边会形成多少个点对满足两点之间不互通
// 思路:思路很简单,分为这个点是否是割点,但写法上就有点讲究,详情见博客
//

/*#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m;
vector<int> e[N];
int dfn[N], low[N], idx, cut[N], ans[N], id, sz[N];
void dfs(int u, int f) {
    dfn[u] = low[u] = ++idx;
    int ch = 0;
    sz[id]++;
    for (auto v : e[u]) {
        if (!dfn[v]) {
            dfs(v, u);
            ch++;
            low[u] = min(low[u], low[v]);
            if (low[v] >= dfn[u]) {
                ans[u] = 2 * (n - sz[id]) * sz[id] + 2 * (n - sz[id] - 1);
                cut[u] = 1;
                ++id;
            }
        }
        else if (v != f) {
            low[u] = min(low[u], dfn[v]);
            sz[id]++;
        }
    }
    if (u == 1 && ch <= 1) cut[u] = 0;
    if (cut[u] == 0)ans[u] = 2 * (n - 1);
}
int main() {
    cin >> n >> m;
    id = 1;
    for (int i = 1; i <= m; i++) {
        int a, b; cin >> a >> b;
        e[a].push_back(b);
        e[b].push_back(a);
    }
    dfs(1, -1);
    for (int i = 1; i <= n; i++) cout << ans[i] << endl;
    return 0;
}*/


#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m;
vector<int> e[N];
int dfn[N], low[N], idx, sz[N];
long long ans[N];
void dfs(int u, int f) {
    dfn[u] = low[u] = ++idx;
    sz[u] = 1;
    ans[u] = n - 1;
    int cut = n - 1;
    for (auto v : e[u]) {
        if (!dfn[v]) {
            dfs(v, u);
            sz[u] += sz[v];
            low[u] = min(low[u], low[v]);
            if (low[v] >= dfn[u]) {
                ans[u] += (long long)sz[v] * (n - sz[v]);
                cut -= sz[v];
            }
        }
        else if (v != f) {
            low[u] = min(low[u], dfn[v]);
        }
    }
    ans[u] += (long long)cut * (n - cut);
}
int main() {
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        int a, b; cin >> a >> b;
        e[a].push_back(b);
        e[b].push_back(a);
    }
    dfs(1, -1);
    for (int i = 1; i <= n; i++) cout << ans[i] << endl;
    return 0;
}

 

标签:sz,POI2008,int,割点,dfs,Blockade,dfn,low,id
From: https://www.cnblogs.com/Aacaod/p/17040962.html

相关文章

  • Tarjan算法求割点
    定义如果在一个图中,删除某个节点连同与之关联的边,会导致整个图的连通分支数增加,那么这个节点叫做割点(ArticulationPoint,CutVertex)如下图:整个图的连通分支数为1,但......
  • 桥与割点,无向图的双连通分量
    Tarjan算法与无向图连通性Tarjan算法求割点与割边定义与性质:定义给定无向连通图\(G=(V,E)\)割点:节点\(x\inV\),若将节点\(x\)及其所相连的所有边删去之后,图\(G\)分......
  • 割点板子
    一些直白的理解,和标准定义有差别,但也足够了 点双连通:一个图任意去掉一个点后仍然联通;   边双连通同理割点:去掉某个点后,图不连通     割边同理 求割点(l......
  • P3469 [POI2008]BLO-Blockade
    P3469[POI2008]BLO-Blockade#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=2e5+5;constintM=2e6+5;inth[N],ne[M],e[M],tot;v......
  • 「题解报告」[POI2008]PER-Permutation
    「题解报告」[POI2008]PER-Permutation点击查看目录目录「题解报告」[POI2008]PER-Permutation思路代码不理解哪里难了,学过扩卢并且推一下式子基本就是两眼切吧。......
  • Luogu 3478 [POI2008]STA-Station
    题目链接:​​传送门​​题目描述给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大输入样例814564567682434输出样例7一句话题意好......
  • 求解割点或点双时一种奇怪写法的说明
    一、没有自环的(如果有自环直接先过滤掉即可)无向图上割点,反向边并不需要判断v!=fa,也就是并不需要判断它会回去。这个时候\(low\)数组的意义发生了改变,但是不影响求解结......
  • Luogu P3469 [POI2008]BLO-Blockade
    [P3469POI2008]BLO-Blockade-洛谷|计算机科学教育新生态(luogu.com.cn)图\(G\)本身联通。删除\(u\)的连边后会形成\(k\ge2\)个连通块(至少会把\(u\)隔离出......
  • 简单易懂的 Tarjan求割点与桥 详解
    一些简单的概念连通分量:无向图G的极大连通子图称为G的连通分量说人话:把无向图G分成几块,满足每一块内都是连通的,且几个块之间不连通,这些块就是G的连通分量割点:无向连通图......
  • P3388 【模板】割点(割顶)
    【模板】割点(割顶)题目背景割点题目描述给出一个\(n\)个点,\(m\)条边的无向图,求图的割点。输入格式第一行输入两个正整数\(n,m\)。下面\(m\)行每行输入两个正整......