题目描述
每头牛都有一个梦想:成为一个群体中最受欢迎的名牛!在一个有
N
(
1
<
=
N
<
=
10
,
000
)
N(1<=N<=10,000)
N(1<=N<=10,000)头牛的牛群中,给你
M
(
1
<
=
M
<
=
50
,
000
)
M(1<=M<=50,000)
M(1<=M<=50,000)个二元组(
A
,
B
)
,
A,B),
A,B),表示A认为B是受欢迎的。既然受欢迎是可传递的,那么如果A认为B受欢迎,B又认为C受欢迎,则A也会认为C是受欢迎的,哪怕这不是十分明确的规定。你的任务是计算被所有其它的牛都喜欢的牛的个数。
输入
第一行,两个数,N和M。第 2 ~ M + 1 2~M+1 2~M+1行,每行两个数,A和B,表示A认为B是受欢迎的。
输出
一个数,被其他所有奶牛认为受欢迎的奶牛头数。
输入样例
3
1 2
2 1
2 3
输出样例
1
样例说明
3号奶牛是唯一被所有其他奶牛认为有名的。
说明
数据范围限制
1
<
=
N
<
=
10
,
000
;
1<=N<=10,000;
1<=N<=10,000;
1 < = M < = 50 , 000 1<=M<=50,000 1<=M<=50,000
解题思路
由于我们校网的数据太水,以至于打个纯暴力都水过了。。(给了我不打正解的机会)。。
原题链接
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,x,y,h[60000],ans[60000],v[60000],lyx,k,t,w;
struct c{
int x,next;
}a[60000];
void add(int x,int y)
{
++k;
a[k].x=y;
a[k].next=h[x];
h[x]=k;
}
void dfs(int x){
v[x]=1;
for(int i=h[x];i;i=a[i].next)
{
int t=a[i].x;
if(!v[t])
{
ans[t]++;
dfs(t);
}
}
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
}
for(int i=1;i<=n;i++)
{
memset(v,0,sizeof(v));
w=i;
dfs(i);
}
for(int i=1;i<=n;i++)
{
if(ans[i]==n-1)
lyx++;
}
printf("%d",lyx);
}