首页 > 其他分享 >tarjan模板

tarjan模板

时间:2024-03-15 16:56:42浏览次数:31  
标签:tarjan int sum ++ dfn low 模板

信息传递
题目描述

tarjan模板

点击查看代码
void tarjan(int x)
{
	dfn[x]=low[x]=++num;
	stk.push(x);
	v[x]=1;
	for(int i=h[x];i;i=nxt[i])
	{
		if(!dfn[to[i]])
		{
			tarjan(to[i]);
			low[x]=min(low[x],low[to[i]]);
		}
		else if(v[to[i]])
		{
			low[x]=min(low[x],dfn[to[i]]);
		}
	}
	if(low[x]==dfn[x])
	{
		sum=0;
		int y;
		++t;
		do
		{
			y=stk.top();
			stk.pop();
			v[y]=0;
			belong[y]=t;
			sum++;
		} while(y!=x);
		if(sum>1) ans=min(ans,sum);
	}
}
本题要求求出最大强连通分量最小值(当然1不算) 所以当sum<2时跳过 还有一个地方就是本题没说所有点都是联通的,所以要循环一遍所有点 如果这个点的dfn值为零,说明这个点和之前搜过的点不在一个图中 最后上代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;

const int maxn=2e5+10;
const int maxm=4e5+10;
int n,tot,num,t,ans=0x3f3f3f3f,belong[maxn],sum;
int h[maxn],nxt[maxm],to[maxm],dfn[maxn],v[maxn],low[maxn];
stack<int> stk;

void addedge(int x,int y)
{
	to[++tot]=y;
	nxt[tot]=h[x];
	h[x]=tot;
}

void tarjan(int x)
{
	dfn[x]=low[x]=++num;
	stk.push(x);
	v[x]=1;
	for(int i=h[x];i;i=nxt[i])
	{
		if(!dfn[to[i]])
		{
			tarjan(to[i]);
			low[x]=min(low[x],low[to[i]]);
		}
		else if(v[to[i]])
		{
			low[x]=min(low[x],dfn[to[i]]);
		}
	}
	if(low[x]==dfn[x])
	{
		sum=0;
		int y;
		++t;//记录强连通分量个数
		do
		{
			y=stk.top();
			stk.pop();
			v[y]=0;
			belong[y]=t;//存y点属于哪个强连通分量
			sum++;
		} while(y!=x);
		if(sum>1) ans=min(ans,sum);//如果是单点构成强连通分量就忽略
	}
}

int main()
{
	scanf("%d",&n);
	int a;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a);
		addedge(i,a);//建图
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i]) tarjan(i);//循环防止有多个图
	}
	printf("%d",ans);
	
	return 0;
}

标签:tarjan,int,sum,++,dfn,low,模板
From: https://www.cnblogs.com/cuichenxi/p/18075800

相关文章

  • VS Code配置Vue3模板代码
    打开VSCode,file-Preferences-ConfigureUserSnippets{"Printtoconsole":{"prefix":"vue","body":["<scriptsetuplang=\"ts\">","i......
  • 高端,漂亮,看的过眼的模板才能激起我的学习兴趣嘛
    在这个万物vue的年代,网页设计越来越框架化。上网搜个资料学习学习吧,咵咵咵,“游泳健身,vue了解一下”我只是想简单地学个html,js啊!怎么就这么复杂!曾几何时,在网上找个网页模板,纯纯的html不带一点儿复杂的东西,最多加点儿jquery。我上面加个头就能当jsp的课后作业了。虽然这种东......
  • C++模板的显式具体化
    C++模板C++没有办法限制类型参数的范围,我们可以使用任意一种类型来实例化模板。但是模板中的语句(函数体或者类体)不一定就能适应所有的类型,可能会有个别的类型没有意义,或者会导致语法错误。例如有下面的函数模板,它用来获取两个变量中较大的一个:template<class T> const T& ......
  • jinja2模块模板语法 django基础
    jinja2去数据库中获取数据,传递给HTML页面,借助于模板语法发送给浏览器还能帮你简单方便的操作字典去后端获取数据库中数据展示到前端页面importpymysqldefget_user(env):去数据库中获取数据,传递给HTML页面,借助于模板语法发送给浏览器还能帮你简单方便的操作字典......
  • C++函数模板的实参推断
    C++模板在使用类模板创建对象时,程序员需要显式的指明实参(也就是具体的类型)。例如对于下面的Point类:template<typename T1, typename T2> class Point;我们可以在栈上创建对象,也可以在堆上创建对象:Point<int, int> p1(10, 20);  //在栈上创建对象Point<char*, c......
  • 线段树模板
    线段树模板沉淀了很久,总算是掌握了线段树的经典模板了。但是还是需要深刻练习才能反复加深印象呢//线段树模板#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;intans[N*4];intt1[N*4],t2[N*4];inta[N];//存放输入数据intn,......
  • C++函数模板的重载
    C++模板当需要对不同的类型使用同一种算法(同一个函数体)时,为了避免定义多个功能重复的函数,可以使用模板。然而,并非所有的类型都使用同一种算法,有些特定的类型需要单独处理,为了满足这种需求,C++允许对函数模板进行重载,程序员可以像重载常规函数那样重载模板定义。我们定义了Swap(......
  • 滑动窗口模板
    /*滑动窗口算法框架*/voidslidingWindow(Strings){//用合适的数据结构记录窗口中的数据HashMap<Character,Integer>window=newHashMap<>();intleft=0,right=0;while(right<s.length()){//c是将移入窗口的字符char......
  • 模板匹配——determine_shape_model_params
    determine_shape_model_params—Determinetheparametersofashapemodel.模版匹配参数确定 determine_shape_model_paramsdeterminescertainparametersofashapemodelautomaticallyfromthemodelimageTemplate.Theparameterstobedeterminedcanbesp......
  • 模板匹配——create_shape_model
    Theoperatorcreate_shape_modelpreparesatemplate,whichispassedintheimageTemplate,asashapemodelusedformatching.TheROIofthemodelispassedasthedomainofTemplate.运算符create_shape_model准备一个模板,该模板在图像模板中传递,作为用于匹配的......