首页 > 其他分享 >tarjan[模板]

tarjan[模板]

时间:2024-11-27 11:56:39浏览次数:6  
标签:tarjan int top ++ dfn low 模板 stac

强连通分量(有向图)

void tarjan(int x)
{
	dfn[x]=low[x]=++cnt;
	stac[++top]=x;
	vis[x]=1;
	for(int i=hd[x];i;i=nxt[i])
	{
		int y=go[i];
		if(!dfn[y])//树边
		{tarjan(y);low[x]=min(low[x],low[y]);}
		else if(vis[y])low[x]=min(low[x],dfn[y]);//在栈中(判横叉边)
	}
	if(low[x]==dfn[x])//出不去
	{
	    col_cnt++;
	    while(stac[top+1]!=x){
	    	c[stac[top]]=col_cnt;
	    	vis[stac[top]]=0;
	    	ve[col_cnt].push_back(stac[top]);
	    	top--;
		}
	}
}

边双连通分量(无向图)

void tarjan(int u,int fa)
{
	dfn[u]=low[u]=++cnt;
	stac[++top]=u;
	int son=0;
	for(int i=hd[u];i;i=nxt[i])
	{
		int v=go[i];
		if(!dfn[v])
		{
			son++;
			tarjan(v,i);
			low[u]=min(low[v],low[u]);
		}
		else if(i!=(fa^1)) low[u]=min(low[u],dfn[v]);//可以通过重边走向父亲
	}
	if(low[u]==dfn[u])
	{
		++col;
		while(stac[top+1]!=u)
		{	
			ans[col].push_back(stac[top--]);
		}	
	}
	return ;
}

点双连通分量(无向图)

void tarjan(int u,int fa)
{
	dfn[u]=low[u]=++cnt;
	stac[++top]=u;
	int son=0;
	for(int i=hd[u];i;i=nxt[i])
	{
		int v=go[i];
		if(!dfn[v])
		{
			son++;
			tarjan(v,u);
			low[u]=min(low[v],low[u]);
			if(low[v]>=dfn[u])
			{
				++col;
				while(stac[top+1]!=v)
				{	
					ans[col].push_back(stac[top--]);
				}	
				ans[col].push_back(u);//因为一个割点可能属于多个点双,所以不能出栈
			}
		}
		else if(v!=fa) low[u]=min(low[u],dfn[v]);
	}
	if(fa==0&&son==0)ans[++col].push_back(u);//特判独立点
	return ;
}

标签:tarjan,int,top,++,dfn,low,模板,stac
From: https://www.cnblogs.com/storms11/p/18572072

相关文章

  • 问EBS R12中怎样实现输出格式是多sheet页excel报表,不用excel模板实现,而是在sqlplus中
    https://www.itpub.net/thread-2094848-1-1.html 来源 手工创建一个EXCEL,放一些数据进去,然后另存为xml表格,用notepad打开看看,里面有代码。把代码用SQL拼接起来。<?xmlversion="1.0"?><?mso-applicationprogid="Excel.Sheet"?><Workbookxmlns="urn:schemas-m......
  • 【模板】叉积
    #include<bits/stdc++.h>usingnamespacestd;constdoubleeps=1e-8;structnode{ intx,y;}p[4];boolcmp1(nodea,nodeb){ if(a.x!=b.x)returna.x<b.x; returna.y<b.y;}intcmp(nodea,nodeb){ if(a.x==b.x&&a.y==b.y)......
  • 实验 24:模板方法模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解模板方法模式的动机,掌握该模式的结构;2、能够利用模板方法模式解决实际问题。 [实验任务一]:数据库连接对数据库的操作一般包括连接、打开、使用、关闭等步骤,在数据库操作模板类中我们定义了connDB()、openDB()......
  • XCPC代码模板库
    数据结构并查集vector<int>fa(n+1);//扩展域并查集注意开n*3+1iota(fa.begin(),fa.end(),0);//带权并查集则同时更新d[x],siz[x]function<int(int)>find=[&](intx){returnx==fa[x]?x:fa[x]=find(fa[x]);};autounite=[&](intx,inty){fa[find(......
  • 网站模板文字内容修改,如何在网站后台或代码编辑器中修改模板文字内容
    修改模板文字内容可以提升网站的信息传达效果。以下是具体步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。输入管理员账号和密码,点击“登录”。进入模板管理:登录后,点击顶部菜单栏中的“模板”或“主题”。选择“模板管理”或“主......
  • 网站模板文字内容修改,如何在网站后台或代码编辑器中准确修改模板文字内容
    修改模板文字内容可以提升网站的信息传达效果。以下是如何准确在网站后台或代码编辑器中修改模板文字内容的步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。输入管理员账号和密码,点击“登录”。进入模板管理:登录后,点击顶部菜单栏中......
  • WinForm调用StiReport报表控件,实现打印模板设计、保存、预览、打印
            usingStimulsoft.Report;usingStimulsoft.Report.Design;usingStimulsoft.Report.Dictionary;usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;......
  • electron+ vue3基础模板
    1.创建一个vue3项目:npmcreatevite@latestelectron-desktop-tool 2.在安装electron之前需要先配置一下安装源 在根目录下新建一个 .npmrc文件strict-ssl=falseregistry=https://registry.npmmirror.com/electron_mirror=https://registry.npmmirror.com/-/binary......
  • 【C++11】可变参数模板/新的类功能/lambda/包装器--C++
    文章目录一、可变参数模板1、基本语法及原理2、包扩展3、empalce系列接口二、新的类功能1、默认的移动构造和移动赋值2、成员变量声明时给缺省值3、defult和delete4、final与override三、STL中一些变化四、lambda1、lambda表达式语法2、捕捉列表3、lambda的应用4、lamb......
  • Tarjan学习笔记
    强连通分量,缩点算法:Tarjan代码及模板强连通图:有向图,任意两点有路径强连通分量:有向图,强连通子图数量前置知识:dfs树(dfs序构成的树)成分:1.树边:dfs树上的边(以下三种边是dfs树上没有但原图上有的边)2.前向边:dfs树的祖先到儿子的边。3.返祖边(后向边):儿子到祖先的边4.横向边:旁系亲......