1. 程式人生 > >LOJ2421 NOIP2015 資訊傳遞 【tarjan求最小環】

LOJ2421 NOIP2015 資訊傳遞 【tarjan求最小環】

LOJ2421 NOIP2015 資訊傳遞

LINK

題目大意就是給你一個有向圖,求最小環

有一個很奇妙的性質叫做每個點只有一條出邊

然後我們考慮對每個強聯通分量進行考慮

發現每個強聯通分量內的邊數一定和點數相等
也就是說一個強連通的大小就是這個環的長度

然後就可以來一個很常規的tarjan算一下就好了

#include<bits/stdc++.h>
using namespace std;
#define N 200010
int prt[N],vis[N],n;
int cnt_scc=0,dfn[N],low[N],ind=0;
stack<int> st;
int ans=
0x3f3f3f3f; void tarjan(int u){ st.push(u);vis[u]=1; dfn[u]=low[u]=++ind; int v=prt[u]; if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]); else if(vis[v])low[u]=min(low[u],dfn[v]); if(low[u]!=dfn[u])return; int tp,siz=0; do{ siz++; tp=st.top(); st.pop(); vis[tp]=0; }while(tp!=u); if(siz!=
1)ans=min(ans,siz); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&prt[i]); for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i); printf("%d",ans); return 0; }