首页 > 其他分享 >Tarjan

Tarjan

时间:2024-07-09 20:09:22浏览次数:5  
标签:Tarjan int tp dfn low sc stack

正常的求环的tarjan

点击查看代码
int tp,s[N],in_stack[N];
int dfn[N],low[N],dfncnt;
int scc[N],sc,sz[N];
void tarjan(int u)
{
	dfn[u]=low[u]=++dfncnt;
	s[++tp]=u;
	in_stack[u]=1;
	for(int i=h[u];i;i=nxt[i])
	{
		int v=to[i];
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(in_stack[v])
		{
			low[u]=min(dfn[v],low[u]);
		}
	}
	if(dfn[u]==low[u])
	{
		sc++;
		while(s[tp]!=u)
		{
			scc[s[tp]]=sc;
			in_stack[s[tp]]=0;
			sz[sc]++;
			tp--;
		}
		scc[s[tp]]=sc;
		in_stack[s[tp]]=0;
		sz[sc]++;
		tp--;
	}
}

圆方树

点击查看代码
#include"bits/stdc++.h"
using namespace std;

const int N=1e6;
int n,m;
int f[N][2];

vector<int> tr[N<<1];
int cnt;
int h[N],to[N],nxt[N],tot;
void add(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=h[x];
	h[x]=tot;
}

int low[N],dfn[N],dfncnt;
int s[N],tp;
void tarjan(int u)
{
	low[u]=dfn[u]=++dfncnt;
	s[++tp]=u;
	for(int i=h[u];i;i=nxt[i])
	{
		int v=to[i];
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
			if(low[v]==dfn[u])
			{
				++cnt;
				for(int x=0;x!=v;--tp)
				{
					x=s[tp];
					tr[cnt].push_back(x);
					tr[x].push_back(cnt);
				}
				tr[cnt].push_back(u);
				tr[u].push_back(cnt);
			}
			else low[u]=min(low[u],dfn[v]);
			if(low[v]>dfn[u])
			{
				
			}
		}
	}
}

int main()
{
	scanf("%d%d",&n,&m);
	cnt=n;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i]) 
		{
			tarjan(i),--tp;
		}
	}
	
	return 0;
}

标签:Tarjan,int,tp,dfn,low,sc,stack
From: https://www.cnblogs.com/zhengchenxi/p/18292676

相关文章

  • Tarjan 求强连通子图
    重温Tarjan,网上看了许多博客感觉都讲的不清楚.故传上来自己的笔记,希望帮到大家.提到的一些概念可以参考oiwiki,代码也是oiwiki的,因为我不认为我能写出比大佬更好的代码了.强连通分量:有向图的最大强连通子图(有向图中任意两点可达)Tarjan对每个结点......
  • Tarjan 求有向图的强连通分量
    重温Tarjan,网上看了许多博客感觉都讲的不清楚.故传上来自己的笔记,希望帮到大家.提到的一些概念可以参考oiwiki,代码也是oiwiki的,因为我不认为我能写出比大佬更好的代码了.强连通分量:有向图的最大强连通子图(有向图中任意两点可达)Tarjan对每个结点维护......
  • Tarjan
    开始我最爱的tarjan吧。说一句,Tarjan最难的不是算法学习,而是如何使用。有向图的强连通分量有向图的强连通分量,是指在有向图的一块地方,在这块地方里面,每个点都能互相到达,这就叫做一个强连通分量定义这里是OIwiki上的定义强连通的定义是:有向图G强连通是指,G中任意两个结......
  • LCA(倍增与Tarjan)
    如果我来到了我们的LCA,我是不是就可以假装偶遇你了首先是倍增法,和ST表如出一辙呢。注意N通常在5e5的范围点击查看代码inthead[N],cnt;structEdge{intfrom,to,nxt;}e[N<<1];voidadd(intu,intv){e[++cnt].from=u;e[cnt].to=v;......
  • Tarjan模板
    Tarjan模板#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>#include<iomanip>#include<stdlib.h>#include<map>#include......
  • 图的连通性(tarjan) 学习笔记
    本文可能含有:部分代码省略,部分资源来源于网络,极其模糊不清的语言表述,粗浅到浮于言表的对于此算法的认识。本文仅用于个人学习与报告使用。若有侵权,请洛谷私信联系笔者要求删除。就连上述文字都是抄袭大佬@GClock_519的,可以看得出笔者拙劣的语文水平(图的连通性相关,顾名思义,......
  • tarjan学习笔记
    在Tarjan算法中为每个结点u维护了以下几个变量:dfn[u]:深度优先搜索遍历时结点u被搜索的次序。low[u]:设以u为根的子树为Subtree(u)。 low[u]定义为以下结点的dfn的最小值: Subtree(u)中的结点;从Subtree(u)通过一条不在搜索树上的边能到达的结点。如何计算low?首先让low[x]......
  • tarjan
    一、缩点题目链接https://www.luogu.com.cn/problem/P3387题目大意题目思路缩点+拓扑序+dp代码#include<iostream>#include<queue>#include<cstring>#include<algorithm>#include<set>#definepipair<int,int>constintN=1e4+5,M=1e5......
  • Tarjan 求双连通分量(点双连通分量、边双连通分量)
    注意:本文只针对无向图。对于无向图,显然不能只考虑简单的连通关系,应该研究一些更强的连通关系:双连通。前置芝士点双连通分量:若一个连通分量任意两点间都存在至少两条不经过(除起点和终点外)相同点的路径,我们就称这个连通分量为点双连通分量。边双连通分量:同理,若一个连通分量......
  • tarjan
    桥定义:删除这条边后连通块数量加1思考先暴力搜出一棵树,然后对于每一条非树边都会构成一个环,这个环上的边就不可能是桥了(拿样例来看)\(1\rightarrow2\)和\(5\rightarrow6\)就是桥假如用\(lca\)来维护加一个树上差分码量就有点惊人了考虑优化如果搜树的顺序改为\(df......