NOIP2015信息传递 强连通分量 tarjan
2016-08-30 19:47
471 查看
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=200000; int sum=0; int begin[maxn],to[2*maxn],next[2*maxn],w[2*maxn],ans[maxn]; int Index,e,top,dfn[maxn],low[maxn],stack[maxn],p[maxn]; inline void tarjan(int x){ int i; dfn[x]=low[x]=++Index; stack[++top]=x; p[x]=1; for(i=begin[x];i;i=next[i]){ int j=to[i]; if(!dfn[j]){ tarjan(j); low[x]=min(low[x],low[j]); } else if(p[j]){ low[x]=min(low[x],dfn[j]); } } if(dfn[x]==low[x]){ sum++; while(1){ int tmp=stack[top--]; ans[sum]++; p[tmp]=0; if(tmp==x)break; } } } inline void add(int x,int y){ to[++e]=y; next[e]=begin[x]; begin[x]=e; } int main(){ int i,j,k,m,n; scanf("%d",&n); for(i=1;i<=n;i++){ int x; scanf("%d",&x); add(i,x); } for(i=1;i<=n;i++) if(!dfn[i]) tarjan(i); sort(ans+1,ans+sum+1); for(i=1;i<=sum;i++) if(ans[i]>1){ printf("%d\n",ans[i]);return 0;} return 0; }
相关文章推荐
- 【题解】NOIP 2015 信息传递(tarjan 强连通分量)
- UOJ146 【NOIP2015】信息传递(强连通分量,Tarjan算法)
- 【NOIP2015】洛谷P2661 信息传递(tarjan)
- 2015 NOIP day2 t2 信息传递 (tarjan 连通图)
- Noip提高组2015 Day1 T2 信息传递 tarjan
- 【Tarjan】UOJ#146 【NOIP2015】信息传递
- 2015 NOIP day2 t2 信息传递 tarjan
- 【NOIP 2015 Day1 T2】信息传递(dfs || 拓扑排序 || Tarjan)
- 【NOIP2015】信息传递(强连通分量)
- [NOIp 2015]信息传递
- 【NOIP2015】信息传递
- 2015 提高组 信息传递--tarjan找最小环
- 【NOIP2015】Day1T2 信息传递
- COGS 2105. [NOIP2015] 信息传递 法一 解题报告
- NOIP 2015 d1t2 信息传递
- C++&Pascal——NOIP2015提高组day1 t2——信息传递
- noip2015 信息传递 强连通块
- codevs 4511 信息传递 NOIP2015 day1 T2
- NOIP2015 信息传递
- [NOIP2015] 提高组 洛谷P2661 信息传递