【图论】tarjan求割点和桥(无向双联通)

本文介绍了使用Tarjan算法求解无向图中的割点和桥。通过邻接表实现,算法的时间复杂度为O(n+m)。文章提供了求解割点和桥的模板代码,并提及了无向图的边双联通缩点问题。
摘要由CSDN通过智能技术生成

参考:https://blog.csdn.net/wtyvhreal/article/details/43530613
因为我是用邻接表写的,所以时间复杂度:O(n+m);
求割点模板:
(前向星):

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=2e5+10;
ll root;
ll dfn[maxn],low[maxn],tott,n,m,ans=-1,vis[maxn],flag[maxn];
stack<ll> s;
ll tot;ll head[maxn];ll fa[maxn];
struct E{
   
	ll to,next;
}edge[maxn<<1];
void add(ll u,ll v){
   
	edge[tot].to=v;
	edge[tot].next=head[u];
	head[u]=tot++;
}
void tarjan(ll x){
   
	ll child=0;
	low[x]=dfn[x]=++tott;
	for(ll i=head[x];i!=-1;i=edge[i].next){
   
		ll v=edge[i].to;
		if(!dfn[v]){
   
			child++;fa[v]=x;
			tarjan(v);
			low[x]=min(low[x],low[v]);
			if(fa[x]!=-1&&low[v]>=dfn[x]) flag[x]=1;
			if(fa[x]==-1&&child>=2) flag[x]=1;
		}else if(v!=fa[x]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值