原先t了很长时间,今天复习了下tarjan,打了一遍,自认为自己的tarjan模板简洁 这道题只有基环树,所以tarjan就可以了
#include<iostream> #include<stack> #include<cstdio> using namespace std; int n,cnt=-1,ans=1<<29,time; stack<int>s; int head[400010],Next[400010],to[400010],dfn[200010],low[200010]; inline int max(int x,int y) { return x>y?x:y; } inline int min(int x,int y) { return x<y?x:y; } inline void insert(int u,int v) { Next[++cnt]=head[u]; head[u]=cnt; to[cnt]=v; } void tarjan(int u) { dfn[u]=low[u]=++time; s.push(u); for(int i=head[u];i;i=Next[i]) { int v=to[i]; if(!dfn[v]) { tarjan(v); } low[u]=min(low[u],low[v]); } if(dfn[u]==low[u]) { int MAX=0; while(s.top()!=u) { s.pop(); MAX++; } MAX++; s.pop(); if(MAX!=1) ans=min(MAX,ans); } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { int u;scanf("%d",&u); insert(i,u); } for(int i=1;i<=n;i++) { if(!dfn[i]) tarjan(i); } printf("%d\n",ans); return 0; }
时间: 2024-10-10 17:14:39