信息傳遞(luogu 2661)
阿新 • • 發佈:2018-10-06
truct bsp pri tdi return pan ++i 最小環 space
-->測評傳送門
給定 n 個人,每個人可以連上一個人建一條單向邊,構成一個有向有環圖,求最小環 輸入樣例5
2 4 2 3 1
輸出樣例3
Tarjan掃一遍過
code
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MX=200001;
struct Edge {
int to,next;
}edge[MX];
int n,k,cnt,top,idx,low[MX],dfn[MX],first[MX],stk[MX];
int ans=MX;
void add(int from,int to)
{
edge[++cnt].to=to;
edge[cnt].next=first[from];
first[from]=cnt;
}
void Tarjan(int x)
{
stk[++top]=x;
dfn[x]=low[x]=++idx;
for(int i=first[x];i;i=edge[i].next) {
int to=edge[i].to;
if(!dfn[to]) {
Tarjan(to);
low[x]=min(low[x],low[to]);
}
else low[x]=min(low[x],dfn[to]);
}
if(low[x]==dfn[x]) {
int d,len=0;
do {
d=stk[top--];
len++;
}while(d!=x);
if(len!=1)
ans=min(ans,len);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) {
int poi;scanf("%d",&poi);
add(i,poi);
}
for(int i=1;i<=n;++i) if(!dfn[i]) Tarjan(i);
printf("%d",ans);
return 0;
}
信息傳遞(luogu 2661)