模拟赛3
6.POPULAR
时间限制:5000MS
内存限制:256000KB
题目描述
每头牛都有一个梦想:成为一个群体中最受欢迎的名牛!在一个有N(1<=N<=10,000)头牛的牛群中,给你M(1<=M<=50,000)个二元组(A,B),表示A认为B是受欢迎的。既然受欢迎是可传递的,那么如果A认为B受欢迎,B又认为C受欢迎,则A也会认为C是受欢迎的,哪怕这不是十分明确的规定。你的任务是计算被所有其它的牛都喜欢的牛的个数。
输入
第一行,两个数,N和M。第2~M+1行,每行两个数,A和B,表示A认为B是受欢迎的。
输出
一个数,被其他所有奶牛认为受欢迎的奶牛头数。
输入样例
3
1 2
2 1
2 3
输出样例
1
样例说明
3号奶牛是唯一被所有其他奶牛认为有名的。
说明
数据范围限制
1<=N<=10,000;
1<=M<=50,000
解题思路
就是每个点暴力dfs
将能到的点 +1
最后判断有多少个点的值为n-1
<stron>就是答案</stron>
AC代码
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,tot,ans,c[10005],f[10005],head[10005];
struct node
{
int to,next;
}a[50005];
void add(int x,int y)
{
a[++tot]=(node){
y,head[x]};
head[x]=tot;
}
void dfs(int x)//dfs
{
c[x]=1;//标记
for(int i=head[x];i;i=a[i].next)
if(c[a[i].to]==0)
{
f[a[i].to]++;
dfs(a[i].to);
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);//建单向图
}
for(int i=1;i<=n;i++)
{
memset(c,0,sizeof(c));
dfs(i);//暴搜
}
for(int i=1;i<=n;i++)
if(f[i]==n-1)ans++;//求点的数量
printf("%d",ans);
return 0;
}