tarjan求桥及割点

tarjan边)模板 tanjan算法相关概念 为了与有向图尽可能保持一致,我们将无向图的一条无向边拆分成两条单向边。两条边互为反向边。 从图中一作为起,进行DFS搜索遍历图,这样会得到一棵树,我们称之为DFS搜索树,该树中的每一条边都来自原图,我们将这些边称为树边,其他图中的边称为非树边。 DFN数组:记录DFS序,也即时间戳、搜索顺序。 LOW数组:记录每个经过一条非树边能回到的所有结的最小DFN值。 集合:在一个无向图中,如果有一个顶集合,删除这个顶集合以及这个集合中所有顶相关联的边以后,图的连通分 阅读详情
/*
求割点,去掉割点连通块的个数
求桥
*/
const int maxV=10010,maxE=100010;

struct Edge
{
    int to,next;
    bool cut;
}edge[maxE];

int Adj[maxV],Size;

void init()
{
    Size=0;
    memset(Adj,-1,sizeof(Adj));
}

void Add_Edge(int u,int v)
{
    edge[Size].to=v;
    edge[Size].next=Adj[u];
    edge[Size].cut=false;
    Adj[u]=Size++;
}

int Low[maxV],DFN[maxV],Stack[maxV];
int Index,top,bridge;
bool Instack[maxV],cut[maxV];
int add_block[maxV];

void Tarjan(int u,int pre)
{
    int v;
    Low[u]=DFN[u]=++Index;
    Stack[top++]=u;
    Instack[u]=true;
    int son=0;
    for(int i=Adj[u];~i;i=edge[i].next)
    {
        v=edge[i].to;
        if(v==pre) continue;
        if(!DFN[v])
        {
            son++;
            Tarjan(v,u);
            Low[u]=min(Low[u],Low[v]);

            if(Low[v]>DFN[u])//bridge
            {
                bridge++;
                edge[i].cut=edge[i^1].cut=true;
            }
            
            /*
            两种割点:1. 不是根节点,2.根节点,但是孩子数大于1
            */

            if(u!=pre&&Low[v]>=DFN[u])//cut_point
            {
                cut[u]=true;
                add_block[u]++;
            }
        }
        else
        {
            Low[u]=min(Low[u],DFN[v]);
        }
    }

    if(u==pre&&son>1) cut[u]=true;
    if(u==pre) add_block[u]=son-1;

    Instack[u]=false; top--;
}

int n;

void solve(int n)
{
    memset(DFN,0,sizeof(DFN));
    memset(Instack,false,sizeof(Instack));
    memset(add_block,0,sizeof(add_block));
    memset(cut,false,sizeof(cut));

    Index=top=bridge=0;

    for(int i=1;i<=n;i++)
    {
        if(!DFN[i]) Tarjan(i,i);
    }
}

Tarjan算法超详细讲解(边强连通) 本文出自我的掘金博客, 欢迎大家访问传送门 今天我主要介绍Tarjan算法在边以及强连通分量中的应用以及缩技巧 按照老规矩, 先上两道模板题 【模板】强连通分量 【模板】顶) 边 一, 离散数学中的定义: : 无向连通图中,去掉一个顶及和它相邻的所有边,图中的连通分量数增加,则该顶称为边: 无向联通图中,去掉一条边,图中的连通分量数增加,则这条边,称为... 阅读详情

相关推荐

ACM快速输入输出

package 输入输出; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenize...

王跃坤的博客 1635

Tarjan思想

一、算法描述   Tarjan算法仍然用了tarjan思想中dfsprenum的dfs序号,parent的dfs树,以及lowest这样一个记录最早回溯位置的数组。lowest计算时下列情况的最小值,即: lowest[u]的值为:prenum[u];如果存在一条非树边(u,v),使得u与一个树上顶连通,这种情况下的prenum[v];u的所有子节的lowest   tarjan处...

远见望远的博客 376

20 图的边—Tarjan算法

图的边—Tarjan算法

xuqw11111的专栏 3373

L2-013红色警报(dijkstra最短路)

原题链接 战争中保持各个城市间的连通性非常重要。本题要你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。 输入格式: 输入在第一行给出两个整数N(0 < N ≤ 500)和M(≤ 5000),分别为城市个数(于是默认城市从0到N-1编号)和连接两城市的通路条数。随后M行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔。在城市信息之后给出被攻占的

m0_46656833的博客 383

Tarjan

的概念 : 简单的说就是,删掉这个和这个有关的边,图就不是连通图,分裂成了多个不连接的子图。 : 删掉这条边后,图就不再是连通图,分裂成为多个不连通的子图。 算法思想: 首先选定一个根节,从根节开始遍历整个图(使用dfs) 对于根节: 如果有2棵即以上的子树,就是(因为如果去掉这个,这两棵子树就不能互相到达) 对于非根节 如果节U的所有孩子节可以不通过父节U而访问到U的祖先节,那么说明:即使去掉节U也不影响图的连通性,U不是。 如果节U至少存在一个孩

稚始稚终的博客 360

图论Tarjan

使用Tarjan方法计算,这里先介绍下概念。 无向连通图中,如果删除某后,图变成不连通,则称该。 无向连通图中,如果删除某边后,图变成不连通,则称该边为。 一个顶u是,当且仅当满足(1)或(2) (1) u为树根,且u有多于一个子树。 (2) u不为树根,且满足存在(u,v)为树枝边(或称父子边,即u为v在搜索树中的父亲),使得dfn(u) 一条无向边(u

gg_gogoing的专栏 3130

tarjan算法——无向图的

一.基本概念 1.:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为无向连通图中,如果删除某边后,图变成不连通,则称该边为。 2.:无向连通图中,如果删除某后,图变成不连通,则称该。 二:tarjan算法在中的应用 1.: 1)当前节为树根的时候,条件是“要有多余一棵子树”(如...

tangzhide123yy的博客 722

tarjan算法

#include&lt;iostream&gt; using namespace std; #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;vector&gt; #define N 201 vector&lt;int&gt;G[N]; int n,m,low[N],dfn[N]; bool is_cut[N]; int fat...

qq_40859951的博客 228

Tarjan无向图详解

Tarjan无向图详解 tarjan算法--无向图的 一.基本概念 1.:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为无向连通图中,如果删除某边后,图变成不连通,则称该边为。 2.:无向连通图中,如果删除某后,图变成不连通,则称该...

swallowblank的博客 226

tarjan边)

tarjan 参考博客:tarjan边) 例题: 代码(重要的地方在代码中都有注释): #include<bits/stdc++.h> #define ll long long using namespace std; const ll M=2e4+10,maxn=3e6+30; int dfn[M],low[M],tot; int e[M&l...

qq_41365703的博客 565

Tarjan算法

力扣1992 tarjan算法进行寻找

rygy_的博客 507

Tarjan算法

预备定义: low[u]定义为u或者u的子树中能够通过非父子边追溯到的最早的节的DFS开始时间 d[u]表示dfs过程中u的进栈时间 :无向连通图中,如果删除某后,图变成不连通,则称该:无向连通图中,如果删除某边后,图变成不连通,则称该边为。 判断方法: (1) u为树根,且u有多于一个子树。 (2) u不为树根,且存在(u,v)为树枝边(或称父子边,即u为v在搜索树中的父亲),使得dfn(u)<=low(v)。 也就是u的子树中的v无法到达u之前的,所以u去掉就

CtrlC_V的博客 712

图论 —— 图的连通性 —— Tarjan

【概念】 1. 1):删除某后,整个图变为不连通的两个部分的 2)集合:在一个无向图中删除该集合中的所有,能使原图变成互不相连的连通块的的集合 3)连通度:最小集合数 如上图,若去掉 0,则图被分成 12和 34 两个连通分量;若去掉 3,则图被分成 012 和 4 两个连通分量。 故:0、3 是,两者是一个集,连通度是 2 2. 1)...

Alex_McAvoy的博客 1937

Tarjan模板题

UVA - 796 Critical Links Tarjan个数 题目链接:Vjudge  题意: 给定N个顶若干条边, 个数。 思路:套用kuangbin大牛的 Tarjan 模板。 #include using namespace std; #define FIN freopen("input.txt","r",stdin) #define

Fighting! 1057

Tarjan

前置知识 邻接表存储及遍历图 tarjan强连通分量 的定义 在一个无向图中,如果有一个顶集合,删除这个顶集合以及这个集合中所有顶相关联的边以后,图的连通分量增多,就称这个集为集合。 也就是说,就是有个维持着连通分量的继续,去掉那个,这个连通分量就无法在维持下去,分成好几个连通分量。 比如说,下图中 蓝色的就是tarjan 前向边 首先,先了解...

szdytom的博客 110

tarjan算法无向图的

tarjan算法无向图的 一篇tarjan算法的完整的解释,写的真的好认真 以下代码来自kuangbin的模板 4.5 图的和双连通分支的基本概念 [连通度与边连通度] 在一个无向连通图中,如果有一个顶集合,删除这个顶集合,以 及这个集合中所有顶相关联的边以后,原图变成多个连通块,就称这个集为集合。 一个图的连通度的定义为,最小集合中的顶数。...

shen253135371的博客 455

tarjan无向图的

#include<iostream> using namespace std; #include<cstdio> #include<cstring> #include<vector> #define N 201 vector<int>G[N]; int n,m,low[N],dfn[N]; bool is_cut[N]; int father[N]; int tim=0; void input() { scanf("%d%d",&.

XFire的博客 281

Tarjan学习笔记

Tarjan

White_gugu的博客 448
上一篇: UVA 796 Critical Links
下一篇: Codeforces 385 C. Bear and Prime Numbers
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值