您的位置:首页 > 运维架构

poj 2186 Popular Cows

2014-02-13 19:45 218 查看
http://poj.org/problem?id=2186

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack>
#define maxn 100001
using namespace std;

int dfn[maxn],low[maxn],belong[maxn],bcnt,bcc_clock,a[maxn],b[maxn],num[maxn],n,m,head[maxn],e;
stack<int>s;
bool vis[maxn],flag[maxn];
struct node
{
int v,next;
}p[maxn];

void add(int u,int v)
{
p[e].v=v;
p[e].next=head[u];
head[u]=e++;
}
void tarjan(int u)
{
dfn[u]=low[u]=++bcc_clock;
vis[u]=true;
s.push(u);
for(int i=head[u]; i!=-1; i=p[i].next)
{
int v=p[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v]&&dfn[v]<low[u])
low[u]=dfn[v];
}
if(dfn[u]==low[u])
{
bcnt++;
int j;
do
{
j=s.top();
s.pop();
vis[j]=false;
belong[j]=bcnt;
}while(j!=u);
}
}

void deal()
{
while(!s.empty())
{
s.pop();
}
memset(dfn,0,sizeof(dfn));
bcnt=0;bcc_clock=0;
for(int i=1; i<=n; i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
}

void inti()
{
e=0;
memset(head,-1,sizeof(head));
memset(belong,0,sizeof(belong));
memset(low,0,sizeof(low));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(num,0,sizeof(num));
memset(flag,false,sizeof(flag));
memset(vis,false,sizeof(vis));
}

int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
inti();
for(int i=1; i<=m; i++)
{
scanf("%d%d",&a[i],&b[i]);
add(a[i],b[i]);
}
deal();
for(int i=1; i<=m; i++)
{
if(belong[a[i]]!=belong[b[i]])
flag[belong[a[i]]]=true;
}
for(int i=1; i<=n; i++)
{
num[belong[i]]++;
}
int t=0,ans;
for(int i=1; i<=bcnt; i++)
{
if(!flag[i])
{
t++;
ans=num[i];
}
}
if(t==1)
printf("%d\n",ans);
else
printf("0\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: