Tarjan求强连通分量、求桥和割点模板
Tarjan 求强连通分量模板、参考博客
#include<stdio.h> #include<stack> #include<algorithm> using namespace std; ; + ; struct EDGE{ int v, nxt; }Edge[maxm]; int Head[maxn], cnt; int DFN[maxn], LOW[maxn], color[maxn], INDEX, id; bool vis[maxn]; int N, M; stack<int> stk; inline void init() { while(!stk.empty()) stk.pop(); ; i<=N; i++) Head[i] = DFN[i] = LOW[i] = color[i] = -, cnt = INDEX = id = ; } inline void AddEdge(int from, int to) { Edge[cnt].v = to; Edge[cnt].nxt = Head[from]; Head[from] = cnt++; } inline void tarjan(int u) { DFN[u] = LOW[u] = INDEX++; stk.push(u); vis[u] = true; ; i=Edge[i].nxt){ int Eiv = Edge[i].v; ){ tarjan(Eiv); LOW[u] = min(LOW[u], LOW[Eiv]); }else{ if(vis[Eiv]) LOW[u] = min(LOW[u], LOW[Eiv]); } } if(DFN[u] == LOW[u]){ color[u] = ++id; vis[u] = false; while(stk.top() != u){ vis[stk.top()] = false; color[stk.top()] = id; stk.pop(); } stk.pop(); } } int main(void) { while(~scanf("%d %d", &N, &M)){ init(); int from, to; while(M--){ scanf("%d %d", &from, &to); AddEdge(from, to); } ; i<N; i++) ) tarjan(i); printf("%d\n\n", id); } ; }
Tarjan 求桥和割点模板
#include<bits/stdc++.h> using namespace std; ;///图中顶点的数量 ;///图中边的数量 struct EDGE{ int v, nxt; }Edge[maxm]; int Head[maxn], cnt;///表头以及边的编号 int LOW[maxn], DFN[maxn];///每个点最早可回溯到的祖先节点、每个点的遍历序号 int Fa[maxn], INDEX;///Fa数组记录每一个点的父亲、INDEX是算法里的时间戳 int N, M; inline void init() { ; i<=N; i++) Head[i] = LOW[i] = DFN[i] = -, Fa[i] = ; cnt = INDEX = ; } inline void AddEdge(int from, int to) { Edge[cnt].v = to; Edge[cnt].nxt = Head[from]; Head[from] = cnt++; } void Tarjan(int v, int Father) { Fa[v] = Father; DFN[v] = LOW[v] = INDEX++; ; i=Edge[i].nxt){ int Eiv = Edge[i].v; ){ Tarjan(Eiv, v); LOW[v] = min(LOW[v], LOW[Eiv]); } else if(Father != Eiv) LOW[v] = min(LOW[v], DFN[Eiv]); } } ///这份代码中顶点编号是从 0 ~ N-1 void Count()///统计割点和桥 { Tarjan(, -); ;///割点的数量 ;///根节点的儿子 Tarjan(, -); ; i<N; i++){ int v = Fa[i]; ) Root_Child++; else if(LOW[i] >= DFN[v] && !is_cut[v]) is_cut[v] = true, Cut_Num++; } ) is_cut[] = true, Cut_Num++;///根节点有超过一个儿子则说明也是割点 ; i<N; i++){ int v = Fa[i]; && LOW[i] > DFN[v]){ // v->i is bridge //可以用一个 pair<int, int> 来记录 } } } int main(void) { while(~scanf("%d %d", &N, &M)){ init(); int from, to; while(M--){ scanf("%d %d", &from, &to); AddEdge(from, to); AddEdge(to, from); } Count(); } ; }
Tarjan求强连通分量、求桥和割点模板的更多相关文章
- Tarjan求强连通分量,缩点,割点
Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...
- tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- tarjan求强连通分量+缩点+割点以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- Tarjan算法打包总结(求强连通分量、割点和Tarjan-LCA)
目录 Tarjan打包总结(求强连通分量.割点和Tarjan-LCA) 强连通分量&缩点 原理 伪代码 板子(C++) 割点 原理 伪代码 最近公共祖先(LCA) 原理 伪代码 板子 Tarj ...
- UESTC 901 方老师抢银行 --Tarjan求强连通分量
思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...
- poj 2186 tarjan求强连通分量
蕾姐讲过的例题..玩了两天后才想起来做 貌似省赛之后确实变得好懒了...再努力两天就可以去北京玩了! 顺便借这个题记录一下求强连通分量的算法 1 只需要一次dfs 依靠stack来实现的tarjan算 ...
- [Uva247][Tarjan求强连通分量][Calling Circles]
题目大意: 例如:A跟B打电话,B跟C打电话,C跟A打电话..D跟E打电话,E跟D不打电话.则A,B,C属于同一个电话圈,D,E分别属于一个电话圈,问有多少个电话圈. 分析 就是裸的求强连通分量,直接 ...
- HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题
Summer Holiday Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- CCF 高速公路 tarjan求强连通分量
问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...
随机推荐
- [转帖]Java 8新特性探究(九)跟OOM:Permgen说再见吧
Java 8新特性探究(九)跟OOM:Permgen说再见吧 https://my.oschina.net/benhaile/blog/214159 need study 很多开发者都在其系统中见过“ ...
- httprunner - 源码解析
这里只是做一个大概的解析,还有很多细节部分没有太过于关注 我们从cli.py开始进行解析 1.argparse.ArgumentParser 接受命令行的各种参数 [ argparse.Argumen ...
- 2018.08.10【省赛&提高A组模拟】比赛总结
题解 这次题目可真是太难了! 糟糕的运气使我AK的步伐寸步难行(士气严重下降). T1 这题还是比较水的(尽管我比赛时只拿了50分) 一些大佬们说:这题只是一道简单的暴力题,枚举l+二分r 就可以了. ...
- Java工具类-基于SnowFlake的短地址生成器
Twitter的SnowFlake算法,使用SnowFlake算法生成一个整数,然后转化为62进制变成一个短地址URL /** * Twitter的SnowFlake算法,使用SnowFlake算法生 ...
- calc,support,media各自的含义及用法
@support:用于检测浏览器是否支持CSS某个属性,即条件判断,如果支持某个属性,可以写一套样式,如果不支持某属性,提供另一套样式作为替补. calc():用于计算动态函数值,支持“+”,“-”, ...
- JavaScript里面9种数组遍历!
大家好,我在这里总结分享了JavaScript中的闹腾的数组循环家族. 1.大家最常用的for循环,我就不解释了: for(let i = 0; i < 5 ; i++){ console.l ...
- mybatis的if
<select id="findList" resultType="BndExport"> SELECT <include refid=&qu ...
- Java缓存要点
1.缓存一般是这样的:先查缓存,查不到就查DB,如果DB查不到就结束,DB查到了就写入缓存. 如果用户一直在大量地查询不存在的数据,则所有的请求都会落到DB,而且没有数据写入缓存. 解决方法:把查不到 ...
- java_day01
ch01: ===================================== java J2SE 桌面应用的开发 JAVA SE corejava J2EE 企业级开发 JAVA EE J2 ...
- fiddler4自动生成jmeter脚本
接口.性能测试任务当遇到从浏览器或移动app自己抓包的情况出现时就变得巨苦逼了,苦在哪里?苦在需要通过抓包工具抓报文,需要通过抓包报文梳理业务逻辑.需要将梳理的逻辑编写成脚本.最最苦的情况是,自己抓包 ...