欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

tarjan

程序员文章站 2022-05-15 14:01:22
...

tarjan
tarjan

#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
#define ll long long
int inf=1e7;
int n,cnt=0,mins=1e7;
int dfn[200005],low[200005];
vector<int> vec[200005];
vector<int> quene;
int isquene[200005];
void init(){
	int i,j;
	for(i=0;i<200005;i++){
		dfn[i]=0;
		low[i]=inf;
		isquene[i]=0;
	}
}
void tarjan(int now){
	int i,j;
	++cnt;
	dfn[now]=cnt;low[now]=cnt;
	quene.push_back(now);
	isquene[now]=1;
	for(i=0;i<vec[now].size();i++){
		j=vec[now][i];
		if(dfn[j]==0){
			tarjan(j);
			low[now]=min(low[now],low[j]);
		}
		else if(isquene[j]==1){
			low[now]=min(low[now],dfn[j]);
		}
	}
	if(dfn[now]==low[now]){
		int y,amount=0;
		do{
			y=quene[quene.size()-1];
			quene.pop_back();
			amount++;
		}while(y!=now);
		if(amount>1){
			if(amount<mins){
				mins=amount;
			}
		}
	}
}
int main(){
	int i,j;
	cin>>n;
	for(i=0;i<n;i++){
		cin>>j;
		vec[i+1].push_back(j);
	}
	init();
	for(i=0;i<n;i++){
		if(dfn[i]==0){
			tarjan(i);
		}
	}
	cout<<mins<<endl;
	return 0;
} 
相关标签: tarjan