首页 > 代码库 > 信息传递
信息传递
原先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; }
信息传递
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。