【2020.10.28SSL普及模拟赛T6】【POPULAR受欢迎的牛】【DFS】

题目描述

每头牛都有一个梦想:成为一个群体中最受欢迎的名牛!在一个有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<=N<=10,000 1<=N<=10,000
1 < = M < = 50 , 000 1<=M<=50,000 1<=M<=50,000

分析

O ( n 2 ) O(n^2) O(n2)过百万谁能当我!?

直接邻接表连边,然后搜每个与它链接的奶牛,如果数量到了n-1就代表ta是一只POPULAR的牛。
然后加到ans数组里,最后统计ans数组

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

int n,m,v[100001],ans[100001],s;
int h[100001],tot;

struct node
{
    
    
	int x,y;
}e[100001];

void add(int x,int y)
{
    
    
	tot++;
	e[tot].x=y;
	e[tot].y=h[x];
	h[x]=tot;
}

void dfs(int x)
{
    
    
	v[x]=1;
	for(int i=h[x];i>0;i=e[i].y)
	{
    
    
		int t=e[i].x;
		if(!v[t])
		{
    
    
			ans[t]++;
			dfs(t);
		}
	}
}

int main()
{
    
    
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
    
    
		int a,b;
		cin>>a>>b;
		add(a,b);
	}
	for(int i=1;i<=n;i++)
	{
    
    
		memset(v,0,sizeof(v)); 
		dfs(i);
	}
	for(int i=1;i<=n;i++)
	{
    
    
		if(ans[i]==n-1) s++;
	}
	cout<<s;
	return 0;
}

做完这题顺利AK。

猜你喜欢

转载自blog.csdn.net/dglyr/article/details/109352409