/*
求割点,去掉割点连通块的个数
求桥
*/
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);
}
}相关推荐
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...
Tarjan思想求割点
一、算法描述 Tarjan算法求割点仍然用了tarjan思想中dfs求prenum的dfs序号,parent的dfs树,以及lowest这样一个记录最早回溯位置的数组。lowest计算时求下列情况的最小值,即: lowest[u]的值为:prenum[u];如果存在一条非树边(u,v),使得u与一个树上顶点连通,这种情况下的prenum[v];u的所有子节点的lowest tarjan处...
20 求图的割点和割边—Tarjan算法
求图的割点和割边—Tarjan算法
L2-013红色警报(dijkstra最短路)
原题链接 战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。 输入格式: 输入在第一行给出两个整数N(0 < N ≤ 500)和M(≤ 5000),分别为城市个数(于是默认城市从0到N-1编号)和连接两城市的通路条数。随后M行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔。在城市信息之后给出被攻占的
Tarjan求割点与桥
割点与桥的概念 割点: 简单的说就是,删掉这个点和这个点有关的边,图就不是连通图,分裂成了多个不连接的子图。 桥: 删掉这条边后,图就不再是连通图,分裂成为多个不连通的子图。 求割点 算法思想: 首先选定一个根节点,从根节点开始遍历整个图(使用dfs) 对于根节点: 如果有2棵即以上的子树,就是割点(因为如果去掉这个点,这两棵子树就不能互相到达) 对于非根节点 如果节点U的所有孩子节点可以不通过父节点U而访问到U的祖先节点,那么说明:即使去掉节点U也不影响图的连通性,U不是割点。 如果节点U至少存在一个孩
图论Tarjan求割点与桥
使用Tarjan方法计算割点与桥,这里先介绍下概念。 无向连通图中,如果删除某点后,图变成不连通,则称该点为割点。 无向连通图中,如果删除某边后,图变成不连通,则称该边为桥。 一个顶点u是割点,当且仅当满足(1)或(2) (1) u为树根,且u有多于一个子树。 (2) u不为树根,且满足存在(u,v)为树枝边(或称父子边,即u为v在搜索树中的父亲),使得dfn(u) 一条无向边(u
tarjan算法——求无向图的割点和桥
一.基本概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥。 2.割点:无向连通图中,如果删除某点后,图变成不连通,则称该点为割点。 二:tarjan算法在求桥和割点中的应用 1.割点: 1)当前节点为树根的时候,条件是“要有多余一棵子树”(如...
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 fat...
Tarjan求无向图割点、桥详解
Tarjan求无向图割点、桥详解 tarjan算法--求无向图的割点和桥 一.基本概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥。 2.割点:无向连通图中,如果删除某点后,图变成不连通,则称该点...
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...
Tarjan算法求割点和桥
力扣1992 tarjan算法进行割点和桥寻找
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点去掉就
图论 —— 图的连通性 —— Tarjan 求割点与桥
【概念】 1.割点 1)割点:删除某点后,整个图变为不连通的两个部分的点 2)割点集合:在一个无向图中删除该集合中的所有点,能使原图变成互不相连的连通块的点的集合 3)点连通度:最小割点集合点数 如上图,若去掉 0,则图被分成 12和 34 两个连通分量;若去掉 3,则图被分成 012 和 4 两个连通分量。 故:0、3 是割点,两者是一个割点集,点连通度是 2 2.桥 1)...
Tarjan模板题求割点,桥
UVA - 796 Critical Links Tarjan求割点个数 题目链接:Vjudge 题意: 给定N个顶点若干条边, 求割点个数。 思路:套用kuangbin大牛的 Tarjan 模板。 #include using namespace std; #define FIN freopen("input.txt","r",stdin) #define
Tarjan求割点和桥
前置知识 邻接表存储及遍历图 tarjan求强连通分量 割点 割点的定义 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合。 也就是说,就是有个点维持着连通分量的继续,去掉那个点,这个连通分量就无法在维持下去,分成好几个连通分量。 比如说,下图中 蓝色的点就是割点。 tarjan求割点 前向边 首先,先了解...
tarjan算法求无向图的割点和桥
tarjan算法求无向图的割点与桥 一篇tarjan算法求割点与桥的完整的解释,写的真的好认真 以下代码来自kuangbin的模板 4.5 图的割点、桥和双连通分支的基本概念 [点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以 及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。 一个图的点连通度的定义为,最小割点集合中的顶点数。...
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",&.
Tarjan求割点和桥学习笔记
Tarjan求割点和桥
1635




被折叠的 条评论
为什么被折叠?



