NOIP2015 提高组 day1 信息传递

来源:互联网 发布:车载刮胡刀淘宝网 编辑:程序博客网 时间:2024/05/17 13:45

tarjan求强连通分量大小的裸题

贴代码

#include<cstdio>#include<cstring>#define MAXN 200000#define INF 1e9using namespace std;inline int Min(int a,int b){return a<b?a:b;}struct node{int to,nxt;}adj[MAXN+5];int n,ans;bool ins[MAXN+5];int sta[MAXN+5],tail;int head[MAXN+5],ecnt;int block[MAXN+5],blcnt;int low[MAXN+5],dfn[MAXN+5],dcnt;void add(int u,int v){adj[++ecnt].to=v;adj[ecnt].nxt=head[u];head[u]=ecnt;}void dfs(int u){int i;ins[u]=true;sta[++tail]=u;low[u]=dfn[u]=++dcnt;for(i=head[u];i;i=adj[i].nxt){int v=adj[i].to;if(dfn[v]==0){dfs(v);low[u]=Min(low[u],low[v]);}else if(ins[v])low[u]=Min(low[u],dfn[v]);}if(low[u]==dfn[u]){++blcnt;int sz=0;do{++sz;ins[sta[tail]]=false;block[sta[tail--]]=blcnt;}while(sta[tail+1]!=u);if(sz>1)ans=Min(ans,sz);}}void tarjan(){int i;ans=INF;memset(dfn,0,sizeof dfn);memset(low,0,sizeof low);for(i=1;i<=n;i++)if(dfn[i]==0)dfs(i);}int main(){freopen("message.in","r",stdin);freopen("message.out","w",stdout);int u,v;scanf("%d",&n);for(u=1;u<=n;u++){scanf("%d",&v);add(u,v);}tarjan();printf("%d\n",ans);}

0 0