首页 > 其他分享 >浅谈 tarjan

浅谈 tarjan

时间:2024-10-18 21:12:23浏览次数:7  
标签:tarjan 浅谈 int cnt book low dfn id

就是记录两个数组:dfn[]low[]

其中dfn[]表示访问的顺序,low[u]用来存储 \(u\) 不经过其父亲能到达的最小时间戳。。。

搬一下 wiki 的图。。。

img

我们发现 \(low[v]\ge dfn[u]\) 可以表示不能回到祖先,则 \(u\) 点位割点。。。

直接上代码P3388------>

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5; 
int r;
int n,m,book[N];
int dfn[N],low[N];
vector <int> k[N];
int id=0,cnt;
void dfs(int x,int fa)
{
	id++;
	dfn[x]=id;
	low[x]=id;
	int son=0;
	for(int i=0;i<k[x].size();i++)
	{
		int y=k[x][i];
		if(!dfn[y])
		{
			son++;
			dfs(y,x);
			low[x]=min(low[x],low[y]);
			if(low[y]>=dfn[x]&&x!=r)
			{
				cnt+=!book[x];
				book[x]=1;
			}
		}
		else
		{
			if(1)
			{
				low[x]=min(low[x],dfn[y]);
			}
		}
	}
	if(x==r&&son>1)
	{
		cnt+=!book[x];
		book[x]=1;
	}
	return;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		k[x].push_back(y);
		k[y].push_back(x);
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])
		{
			r=i;
			dfs(i,0);
		}
	}
	cout<<cnt<<"\n";
	for(int i=1;i<=n;i++)
	{
	    if(book[i]==1)cout<<i<<" ";
	}
	return 0;
}

标签:tarjan,浅谈,int,cnt,book,low,dfn,id
From: https://www.cnblogs.com/tyccyt/p/18475048

相关文章

  • 浅谈一类最短路问题
    P2685[TJOI2012]桥首先求出一个最短路树,显然只能删除树上的边才对答案有影响。最短路树有很多,任意求一个可以吗?可以,因为删除一条边后就可以走另一个最短路树了。枚举删除哪一条边并不好计算。考虑最后我们最短路一定是\(1\tol_x\tox\toy\tor_y\ton\)的样子,所以我们考......
  • 浅谈flex布局
    flex布局1.flex布局如何生效如图所示,在一个父盒子中有三个子盒子.代码如下:<divclass="bigbox"><span>1</span><span>2</span><span>3</span></div>大家看到这里不禁会有个疑问:为什么sp......
  • Tarjan求强连通分量
    思路首先建成DFS树,对于每个节点,储存两个信息:dfn与low。每当遍历到一个节点,就将其压入栈中,作用后面会说。dfn储存一个节点的dfs序,low储存一个节点的子树能够到达的在栈中的最小dfs序。首先有一个性质,每个节点子树中所有节点的dfn必然大于当前节点的。那么,假如一个节点的low小......
  • 浅谈 K-D Tree 及其进阶应用
    前言\(\text{K-DTree(K-DimensionTree)}\)是一种可以有效处理高维信息的数据结构。在一般信息学竞赛题目中\(k=2\),此时它又称\(\text{2-DTree}\)。但遗憾的是,\(k\ge3\)的情况并不常见,这个我们后面再说明原因。算法描述问题首先从简单的情况考虑起,假设信息只有一......
  • Tarjan缩点题单 刷题题解
    Tarjan缩点可以将一个图的每个强连通分量缩成一个点,然后构建新图,该图就会变成一个有向无环图。变成有向无环图之后就能结合最短路,拓扑......解决相应题目洛谷题单分享:https://www.luogu.com.cn/training/526565前几道是绿题,没什么好写的,大致过一下1.强连通分量题目链接:https:......
  • 浅谈Java之UDP通信
    一、基本介绍        Java提供了用于处理UDP(用户数据报协议)的类和方法。UDP是一种无连接的网络协议,它允许发送端和接收端之间无需建立连接即可发送数据。在Java中,你可以使用java.net包中的DatagramSocket和DatagramPacket类来实现UDP通信。二、简单用法以下是使用......
  • 浅谈js中的部分方法
    hello!大家好,我是一名正在乱学前端技术的大学生,欢迎大家关注我,一起探讨前端技术,如有讲错的地方麻烦提出指正。letstr1="hello"//注:头尾有一个空格console.log(str1.charAt(1))//h,charAt返回字符串下标字符console.log(str1.replace('el','a'))//halo,rep......
  • 浅谈AI人工智能
    初识大模型和Python人工智能定义人工智能(ArtificialIntelligence,AI):用人工的方法,在机器上实现智能人工智能是研究、开发用于模拟、延伸和扩展人的智能理论、方法、技术及应用系统的一门新的技术科学,是计算机科学的一个分支。AI的技术划分机器学习算法机器学习概念是人工智......
  • $Tarjan$强连通分量
    有向图缩点非常板,先缩点再拓扑。其实\(Tarjan\)强连通分量缩点往往与拓扑排序求最长路(或其他)密切相关。有向图缩点问有向图上哪个点,其它点都能走到它题面,先缩点,看缩完后有哪些点出度为\(0\),若有多个,则无解,否则即为那一个。最大半联通子图题面先缩点,可以发现缩点后最大半联通......
  • 浅谈李超线段树
    众所周知,\(Li\Chao\Tree=LCT=Link\Cut\Tree\)。在我们的日常学习生活中,经常会遇到以下问题:维护一种数据结构,要求:添加一条线段求解\(x=k\)与所有线段交点中,\(y\)最大的一个。众所周知,线段会影响一个区间的答案。区间取\(max+\)单点最大值,想到线段树。但是该怎......