2020.10.28 普及组3(团队校网)第六题(dfs)

模拟赛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
点的数量就是答案

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;
}

谢谢

猜你喜欢

转载自blog.csdn.net/weixin_45524309/article/details/109397498