poj2186——Popular Cows

来源:互联网 发布:javascript无法跳转 编辑:程序博客网 时间:2024/06/06 00:18

今天重温tarjan算法。代码:

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<stack>#include<string.h>using namespace std;#define N 10005#define min(a,b) (a<b? (a):(b))class node{public:int u,v,next;};node g[N*5];int len,head[N];int n,m;void add(int a,int b){g[++len].u =a;g[len].v =b;g[len].next =head[a];head[a]=len;}int low[N],dfn[N],index,belong[N],cnt,vis[N];stack<int >q;void tarjan(int u){int i;low[u]=dfn[u]=++index;q.push (u);vis[u]=1;for(i=head[u];i;i=g[i].next){int v=g[i].v ;if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}else if(vis[v])low[u]=min(low[u],dfn[v]);}if(dfn[u]==low[u]){cnt++;int k;do{k=q.top ();belong[k]=cnt;q.pop ();vis[k]=0;}while(!q.empty ()&&k!=u);}}void find(){int i,ans,flag,k;memset(vis,1,sizeof(vis));for(i=1;i<=len;i++){if(belong[g[i].u ]!=belong[g[i].v ])vis[belong[g[i].u ]]=0;}flag=0;k=0;for(i=1;i<=cnt;i++)if(vis[i]){flag++;k=i;}if(flag>1)printf("%d\n",0);else{ans=0;for(i=1;i<=n;i++)if(belong[i]==k)ans++;printf("%d\n",ans);}}void solve(){memset(dfn,0,sizeof(dfn));memset(vis,0,sizeof(vis));index =0,cnt=0;for(int i=1;i<=n;i++){if(!dfn[i])tarjan(i);}find();}int main(){len =0;memset(head,0,sizeof(head));cin>>n>>m;for(int i=0;i<m;i++){int a,b;scanf("%d%d",&a,&b);add(a,b);}solve();return 0;}

悲剧,真是悲剧!太悲剧了~这是我想说的,这道题,就不知刷了多少提交次数了,一直RE,就是不见Accepted!悲剧!

tarjan算法没错,错的是a[],b[]数组开小了,好郁闷的说,调试了一天整有余了,才恍然大悟!