首页 > 其他分享 >tarjan板子整理

tarjan板子整理

时间:2024-03-08 09:23:35浏览次数:26  
标签:pre tarjan temp int cnt 板子 low 整理

缩点

stack<int>q;
void tarjan(int u)
{
	pre[u]=low[u]=++cnt;
	q.push(u);
	vis[u]=1;
	for(int i=head[u];i;i=nxt[i])
	{
		int y=to[i];
		if(!pre[y])
		{
			tarjan(y);
			low[u]=min(low[u],low[y]);
		}
		else if(vis[y])
		{
			low[u]=min(low[u],pre[y]);
		}
	}
	if(low[u]==pre[u])
	{
		num++;
		int temp;
		do{
			temp=q.top();
			q.pop();
			vis[temp]=0;
			id[temp]=num;//缩出来的点
			sz[num]++;//每一个缩点的大小
		}while(u!=temp);
	}
}

割点

void tarjan(int u)
{
	pre[u]=low[u]=++cnt;
	int now=0;
	for(int i=head[u];i;i=nxt[i])
	{
		int y=to[i];
		if(!pre[y])
		{
			tarjan(y);
			low[u]=min(low[u],low[y]);
			if(low[y]>=pre[u])//如果u的访问时间比y最早返回的点的时间还靠前,那u被割了y一定不连通
			{
				now++;
				if(u!=root||now>1)
					vis[u]=1;//被标记的即割点
			}
		}
		else
			low[u]=min(low[u],pre[y]);
	}
}

割边

void tarjan(int u,int fa)
{
	pre[u]=low[u]=++cnt;
	for(int i=head[u];i;i=nxt[i])
	{
		int y=to[i];
		if(!pre[y])
		{
			tarjan(y,u);
			low[u]=min(low[u],low[y]);
			if(low[y]>pre[u])
			{
				if(u!=root||now>1)
					vis[(u+1)>>1]=1;//无向图存了两条边 
			}
		}
		else if(y!=fa) low[u]=min(low[u],pre[y]);
	}
}

点双连通分量

void tarjan(int u)
{
    low[u]=pre[u]=++tim;
    q.push(u);
    if(u==root&&head[u]==0)
    {
        dcc_cnt++;
        dcc[dcc_cnt].push_back(u);
        return;
    }//根节点特判 
    int cnt=0;
    for(int i=head[u];i;i=nxt[i])
    {
        int j=to[i];
        if(!pre[j])
        {
            tarjan(j);
            low[u]=min(low[u],low[j]);
            if(pre[u]<=low[j])
            {
                cnt++;                 
                if(u!=root||cnt>1)vis[u]=true;
                ++dcc_cnt;//点双个数 
                int temp;
                do{
                    temp=q.top();
                    q.pop();
                    dcc[dcc_cnt].push_back(temp);//每个点双的点 
                }while(temp!=j);
                dcc[dcc_cnt].push_back(u);
            }
        }
        else low[u]=min(low[u],pre[j]);
    }
}

标签:pre,tarjan,temp,int,cnt,板子,low,整理
From: https://www.cnblogs.com/oceansofstars/p/18060297

相关文章

  • 数位dp板子(待补充)
    #include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<string>#include<string.h>#include<iomanip>#include<map>#include<queue>usingnamespacestd;typedeflonglongll;......
  • 多项式板子
    不想折磨自己了,以后都来这里贺。卷积:点击查看代码polyNTT(polya,intopt){intlen=a.size();For(i,0,len-1){if(i<r[i])swap(a[i],a[r[i]]);}for(intk=1;k<len;k<<=1){llwn=qpow(((opt==1)?g:inv_g),((mod-1)/(k<<1)));for(inti......
  • FPGA的ADC采集部分学习整理
    adc采集部分还是很有用的,模数转换在很多地方都用得到。使用的EDA模块上的ADC芯片是adc128s102。逐次逼近型ADC(一般单片机用的都是逐次逼近型,速度较快,成本低)。8通道以及12位分辨率。这边手册上说模拟电源的VA输入范围为2.7V~5.25VADC芯片,接入8个模拟输入引脚,输入模拟量。IN0~IN......
  • 大语言模型常见的文本切分方式整理汇总
    整理本文整理了一些简单的文本切分方式,适用于大语言模型经典应用RAG或相似场景。一般切分如果不借助任何包,很容易想到如下切分方案:text="我是一个名为ChatGLM3-6B的人工智能助手,是基于清华大学KEG实验室和智谱AI公司于2023年共同训练的语言模型开发的。我的目标是......
  • js 数组筛选方法使用整理_JavaScript常用数组元素搜索或过滤
    一、常用方案介绍:如果你想找到在符合特定条件的阵列中的所有项目,使用filter。如果你想检查是否至少有一个项目符合特定的条件,请使用find。如果你想检查一个数组包含一个特定的值,请使用includes。如果要在数组中查找特定项目的索引,请使用indexOf 二、js数组筛选方法......
  • 板子
    例题题目描述某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象。因为连接计算机的网线本身不同,所以有一些连线不是很畅通,我们用f(i,j)表示i,j之间连接的畅......
  • 常用sql语句整理
    整理一下之前工作常用的一些基础sql语句。查询语句1、SELECT:用于从数据库中查询数据。可以选择要查询的列,并使用逗号分隔多个列。SELECT*FROMusers;2、WHERE:用于指定查询条件。可以使用WHERE子句来过滤查询结果,只返回满足特定条件的行。SELECT*FROMusersWHEREage......
  • sql学习整理
    studentsclassteacher_idstudentmath_gradechinese_gradesex1t1n16080女2t2n25090男3t1n38030男   1、groupby和having函数的应用selectmax(msg_timestamp)as'最大秒数',count(distinctuser_id)as'企微购房通用......
  • 关于AI智能生成(AIGC),整理一下你该知道这些
    ​ 什么是AIGC生成式人工智能(Artificial Intelligence Generated Content)定义百度百科生成式人工智能AIGC(Artificial Intelligence Generated Content)是人工智能1.0时代进入2.0时代的重要标志。GAN、CLIP、Transformer、Diffusion、预训练模型、多模态技术、生成算......
  • C++ map用法总结(整理)
    (转载补充)原文链接:https://blog.csdn.net/sevenjoin/article/details/819438641,map简介map是STL的一个关联容器,它提供一对一的hash。第一个可以称为关键字(key),每个关键字只能在map中出现一次;第二个可能称为该关键字的值(value);map以模板(泛型)方式实现,可以存储任意类型的数......