poj 2186 Popular Cows
2014-02-13 19:49
190 查看
http://poj.org/problem?id=2186
题意:
N头奶牛,给出若干欢迎关系a,b,表示a欢迎b,欢迎关系是单向的,但也是可以传递的,另外每个奶牛都是欢迎他自己的。求出被所有奶牛欢迎的奶牛的数目。
#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;
}
题意:
N头奶牛,给出若干欢迎关系a,b,表示a欢迎b,欢迎关系是单向的,但也是可以传递的,另外每个奶牛都是欢迎他自己的。求出被所有奶牛欢迎的奶牛的数目。
#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;
}
相关文章推荐
- poj2186-Popular Cows
- POJ2186 Popular Cows 强连通分量tarjan算法
- POJ_2186 Popular Cows (Tarjan 强连通分量 缩点)
- POJ 2186 Popular Cows(初学强连通)
- POJ2186——Popular Cows
- poj 2186 Popular Cows (强连通分量 tarjan)
- POJ 2186:Popular Cows Tarjan模板题
- POJ 2186 Popular Cows
- poj 2186 Popular Cows
- POJ 2186 Popular Cows【强连通】
- POJ-2186-Popular Cows 解题报告
- poj 2186 Popular Cows
- poj 2186 Popular Cows 给定一个有向图,求有多少个顶点是由任何顶点出发都可达的 Kosaraju算法+缩点
- POJ 2186 Popular Cows
- POJ 2186 Popular Cows(强连通分量模板题)
- 【poj 2186】Popular Cows(强连通分量)
- Poj 2186 Popular Cows
- POJ 2186 Popular Cows(强连通分量缩点,Tarjan算法)
- POJ 2186 Popular Cows(强连通分量)
- POJ 2186 Popular Cows 题目