Tarjan无向图求割点割桥模版, O(n+m), 无重边/重边情况均可处理
来源:互联网 发布:试客联盟软件 编辑:程序博客网 时间:2024/06/13 20:56
/* Function:Tarjan无向图求割点割桥, O(n+m), 无重边/重边情况均可处理 1. 求出所有的桥,再将 */#include<bits/stdc++.h>#define rep(i,a,b) for(int i=a; i<=b; ++i)#define repp(i,a,b) for(int i=b; i>=a; --i)#define fi first#define se second#define mp make_pair#define pb push_back#define ms(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long ll;typedef pair<int, int> pii;typedef vector<int>vi;const int maxn = 1e5+7;// 建边 struct edge{ int to, next;}e[maxn << 1]; //两倍空间 int fi[maxn], id=0;void adde(int u, int v){ e[id].to = v; e[id].next = fi[u]; fi[u] = id++; return ;}int dfn[maxn], low[maxn], sig; bool cut[maxn]; //是否为割点typedef pair<int, int> pii; vector<pii>cutbg; //保存割桥void init(){ ms(fi, -1), ms(dfn, 0), ms(low, 0), ms(cut, false); sig = id = 0; cutbg.clear(); return ;} void tarjan(int u,int eid) // eid指父亲边 { low[u] = dfn[u] = ++sig; int i, son = 0; // 记录子树 for(i = fi[u]; ~i; i = e[i].next){ int to = e[i].to; if( i == (eid^1) ) continue; //重边 if( !dfn[to] ){ son++; tarjan( to, i ); low[u]=min(low[u],low[to]); if(low[to] > dfn[u]){ // 判断割桥 cutbg.push_back(make_pair(u, e[i].to)); } if(low[to] >= dfn[u]){ // 判断割点 cut[u] = true; } } else low[u]=min(low[u],dfn[to]); } if(eid == -1 && son <= 1) cut[u] = 0; // 当u为根节点,且u只有一个子树或没有子树的时候 , u一定不是割点 } int main(){ //freopen("in.txt", "r", stdin); int n, m; while(scanf("%d%d",&n,&m)==2&&n) { init(); int u, v; rep(i, 1, m){ scanf("%d%d",&u,&v); adde(u,v); adde(v, u); } tarjan(1,-1); // 若确定为联通图 /* 若不确定是否是联通图 rep(i, 1, n){ if(!dfn[i]){ tarjan(i,-1); } } */ cout <<"割点 : " ; rep(i, 1, n){ if(cut[i]){ cout << i<<" "; } } cout << endl; cout << "割桥 :\n"; int len = cutbg.size(); rep(i, 0, len-1){ printf("(%d,%d)\n", cutbg[i].fi, cutbg[i].se); } } return 0;}
阅读全文
0 0
- Tarjan无向图求割点割桥模版, O(n+m), 无重边/重边情况均可处理
- Tarjan O(n+m) 算法【转】
- 最小环(有向无向均可)
- hdu 4612 Warm up (带有重边的无向图Tarjan+树的直径)
- Tarjan求强联通分量以及Tarjan O(m+n)求LCA
- poj1144Network 无向图求割点Tarjan
- 无向图 tarjan 总结
- 用Tarjan算法求无向连通图割点&&割边
- hdu3849 Tarjan求无向图的割边+map
- *无向图求桥+边双连通分量——Tarjan
- Tarjan 求无向图中的 关节点,和重连通分量
- 给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~
- ZOJ2588 无向图求割边 tarjan算法
- 模板,无向图强连通缩点,tarjan
- POJ 1144 Network 无向图求割点Tarjan
- tarjan无向图求割点,cpp板子
- UVA315_Network _无向图割点::Tarjan
- Tarjan无向图最小权值割边
- XListview
- 报名丨2017 GrowingIO 增长大会(北京)
- 给出一组整数型的数据,找出最大值,数据的个数是任意的
- LINQ体验(1)——Visual Studio 2008新特性
- 蚂蚁金服ATEC峰会首次亮相云栖,CTO程立详解技术开放全战略
- Tarjan无向图求割点割桥模版, O(n+m), 无重边/重边情况均可处理
- 大咖丨哥伦比亚教授周以真:人工智能恐慌以及大数据威胁反思
- 手把手 | 如何在你的iPhone上建立第一个机器学习模型(Apple最新CoreML框架入门)
- [java]微服务架构连载No7 配置中心Config
- HttpClient get和HttpClient Post请求的方式获取服务器的返回数据
- 前言
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
- MXNet框架的resize操作
- 机器学习之归一化(Normalization)