tarjan
程序员文章站
2022-05-15 14:01:22
...
#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;
}
推荐阅读
-
BZOJ2208: [Jsoi2010]连通数(tarjan bitset floyd)
-
BZOJ1093: [ZJOI2007]最大半连通子图(tarjan dp)
-
洛谷 P3388 【模板】割点(割顶)(Tarjan)
-
[HDU-1269] SCC tarjan求强连通分量模板题
-
算法竞赛——进阶指南——acwing 367. 学校网络 SCC - tarjan求强连通+思维
-
POJ 2942Knights of the Round Table(tarjan求点双+二分图染色)
-
Tarjan学习笔记
-
POJ 3694 Network(Tarjan求割边+LCA)
-
BZOJ2707: [SDOI2012]走迷宫(期望 tarjan 高斯消元)
-
LCA算法实际应用 PAT (Advanced Level) Practice 1151 LCA in a Binary Tree (30分) 四种方法完成题目+tarjan详细讲解!