割点和桥

割点和桥的概念都是在无向图中

给定无向连通图G(V,E)

若对于xV,从图中删除节点x以及所有x链接的边后,G分裂成两个或两个以上个不相连的子图,则称xG割点

割点判定法则

x不是搜索树的根节点,则x是割点当且仅当搜索树上存在一个x的子节点y满足dfn[x]low[y].

特别的,若x是搜索树的根节点,则x是割点的条件当且仅当搜索树上存在至少两个子节点满足.

vector<vector<int>> e; int cnt = 0; vector<int> dfn, low; vector<int> cut; // 储存所有的割点 void tarjan( int p , bool root = true ){ int tot = 0; low[p] = dfn[p] = ++ cnt; for( auto q : e[p] ){ if( !dfn[q] ){ tarjan( q , false ); low[p] = min( low[p] , low[q] ); tot += ( low[q] >= dfn[p]); // 统计满足条件的子节点数 }else low[p] = min( low[p] , dfn[q] ); } if( tot > root ) cut.push_back(p); return ; }

若对于eE,从图中删除边e之后,G分裂成两个不相连的子图,则称eG割边

割边判定法则

无向边(x,y)是桥,当且仅当搜索树上存在x的一个子节点y,满足dfn[x]low[y].

桥一定是搜索树中的边,一个简单环中的边一定都不是桥。

vector<pii> bridges; vector<vi> e; vi dfn, low, fa; int cnt; void tarjan(int x) { low[x] = dfn[x] = ++cnt; for (auto y: e[x]) { if (!dfn[y]) { fa[y] = x, tarjan(y); low[x] = min(low[x], low[y]); if (low[y] > dfn[x]) bridges.emplace_back(x, y); } else if (fa[x] != y) low[x] = min(low[x], dfn[y]); } return; }

__EOF__

本文作者PHarr
本文链接https://www.cnblogs.com/PHarr/p/17757591.html
关于博主:前OIer,SMUer
版权声明CC BY-NC 4.0
声援博主:如果这篇文章对您有帮助,不妨给我点个赞
posted @   PHarr  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示