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个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...
随机推荐
- 常用PostgreSQL HA(高可用)工具收集
PostgreSQL HA Collect: 1.pgpool 2.Pacemaker + Corosync 3.ecox 4.Patroni: A Template for PostgreSQL H ...
- Entity Framework常用方法及案例
⒈Skip(int count) 说明:跳过集合的前n个元素:延迟.即我们跳过给定的数目返回后面的结果集. ⒉Take(int count) 说明:获取集合的前n个元素:延迟.即只返回限定数量的结果集 ...
- Laravel-admin form 表单是增加或者修改
Laravel-admin 实现 form 表单是增加或者修改的三种方法,应用情景:1.新增或者修改 form 展示的表单不同:2.新增或者保存前后回调进行其他的操作 1. use Illuminat ...
- PHP与MySQL的连接
一.PHP的相关扩展 PHP与MySQL的交互需要要借助PHP提供的数据库扩展,在PHP中提供了多种数据库扩展,常用的MySQL扩展, MySQLi扩展和PDO扩展. 1.三者各自的特点: MySQL ...
- python-day9(正式学习)
目录 深浅拷贝 拷贝 浅拷贝 深拷贝 异常处理 什么是异常 语法错误 逻辑错误 异常的种类 常用的异常 其他异常 异常处理 提前预防 事后预防 抛出异常(基本没用) 断言(调试用,现在基本上没用) 文 ...
- xargs、chattr命令
一.xargs:将标准输入转化成命令行参数 用法:xargs [OPTION] ... COMMAND INITIAL-ARGS ...使用参数INITIAL-ARGS运行COMMAND,并从输入中读 ...
- 树莓派 ubuntu mate 16.4 frp使用什么版本 如何让外网访问
首先 frp选择frp arm 我选的是32位 你先需要一个有公网ip的服务器,然后搜索网上frp的教程,网上很多足够
- js 数据类型的判断
1. typeof 运算符 typeof 可以判断基本数据类型: typeof 123; // "number" typeof 'abc'; // "string&quo ...
- TVM安装
因为现在NNVM的代码都转移到了TVM中,NNVM代码也不再进行更新,因此选择安装的是TVM. git clone --recursive https://github.com/dmlc/tvm su ...
- java中的compareto方法的详细介绍
java中的compareto方法的详细介绍 Java Comparator接口实例讲解(抽象方法.常用静态/默认方法) 一.java中的compareto方法 1.返回参与比较的前后两个字符串的as ...