首页 > 其他分享 >tarjan割边

tarjan割边

时间:2023-03-26 15:01:41浏览次数:40  
标签:tarjan int 割边 low nex cnt now op

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>

using namespace std;

int cnt = 1,l[100005],h[100005],nex[100005];
int num,p,stack[100005],low[100005],dfn[100005];
bool op[100005],op_sig[100005];//op_sig判断路径是否走过 
int f,r,a,b,ans;

inline void add( int v1 , int v2 ) {
	++ cnt;
	l[cnt] = h[v1];
	h[v1] = cnt;
	nex[cnt] = v2;
	
	++ cnt;
	l[cnt] = h[v2];
	h[v2] = cnt;
	nex[cnt] = v1;
}

void tarjan( int now ) {
	dfn[now] = low[now] = ++ num;
	stack[++ p] = now;
	op[now] = true;
	for (int i = h[now]; i != 0; i = l[i]) {
		if( op_sig[i] == false) {
			if ( dfn[nex[i]] == 0 ) {
				op_sig[i] = true;//2^1=3 3^1=2 ......
				op_sig[i^1] = true;//4^1=5 5^1=4... ...
				//标记now到nex[i]的路径已经走过 
				tarjan( nex[i] );
				low[now] = min( low[now] , low[nex[i]] );
				if ( low[nex[i]] > dfn[now] ) {
                                        //只有这种情况是割边
					ans++;
				}
			}
			else {
				if ( op[nex[i]] ) {
					low[now] = min( low[now] , dfn[nex[i]] );
				}
			}
		}
	}
	if ( dfn[now] == low[now] ) {
		int temp;
		do {
			temp = stack[p];
			op[temp] = false;
			p --;
		} while ( now !=temp );
	}
	return;
}

int main() {
	scanf("%d%d",&f,&r);
	for (int i = 1; i <= r; ++i){
		scanf("%d%d",&a,&b);
		add( a , b );
	}
	tarjan( 1 );
	printf("%d\n",ans);
	return 0;
} 

标签:tarjan,int,割边,low,nex,cnt,now,op
From: https://www.cnblogs.com/jueqingfeng/p/17258698.html

相关文章

  • Tarjan算法详解
    Tarjan算法介绍Tarjan算法是用于在有向图中求强连通分量的算法这里给出强连通分量的定义:有向图中一个最大的图,使这个图中每个两点都能够互相到达。这个最大的图称为强连......
  • Tarjan算法详解
    Tarjan算法介绍TarjanTarjan算法是用于在有向图中求强连通分量的算法这里给出强连通分量的定义:有向图中一个最大的图,使这个图中每个两点都能够互相到达。这个最大的图称......
  • tarjan-xue-xi-bi-ji
    title:'tarjan学习笔记'date:2022-12-3015:00:56tags:[学习笔记]published:truehideInList:falsefeature:isTop:false1.概念强连通分量:在有向图或无向图......
  • Unfinished:Tarjan
    本文仅发布于此博客和作者的洛谷博客,不允许任何人以任何形式转载,无论是否标明出处及作者。一、割点模板题:link首先我们先来看看割点这个玩意到底是什么。在一个无向......
  • Tarjan中的low值
    tarjan算法的中的low值参考链接:强连通分量-OIWiki(oi-wiki.org)graphs-Tarjan'sSCC:exampleshowingnecessityoflowlinkdefinitionandcalculationrule......
  • 【YBT2023寒假Day5 B】全面沦陷(tarjan)
    全面沦陷题目链接:YBT2023寒假Day5B题目大意给你一个有向图,问你有多少个点可以到达所有点。一个点x能到达一个点y当且仅当在原图有路径或在把边反向的图中有路径。......
  • tarjan求有向图强连通分量
    tarjan算法的简单应用hdu1269题目链接题意给定有向图,问改有向图是否只有一个强连通分量思路tarjan算法求有向图强连通分量的简单应用代码#include<iostream>......
  • Tarjan 强连通分量 板子
    #include<bits/stdc++.h>usingnamespacestd;constintN=10005;intn,m;intscc[N],siz[N],cnt;intdfn[N],low[N],tot;bitset<N>instk;stack<int>stk;......
  • Tarjan 算法 (图连通性)
    1.割边和割点首先我们dfs一遍构造出dfs树并排出dfn序.显然这棵树没有横叉边.考虑割边的形成条件.显然割边只能是树边,因为非树边会和对应的树上的路径组成环.......
  • P3225 [HNOI2012]矿场搭建 tarjan
    //题意:在一幅无向图图上,删除一个点后,其他所有点上的人还能通过其他点出去,问最少设置几个出口,以及方案数//思路:无向图就联想到双联通分量,我们来分类讨论一下//1......