[2020.10.28 Torneo de simulación de popularización SSL T6] [POPULAR popular cow] [DFS]

Descripción del Título

Cada vaca tiene un sueño: ¡convertirse en la vaca más popular de un grupo! En un rebaño de N (1 <= N <= 10,000) vacas, dé M (1 <= M <= 50,000) dos tuplas (A, B) para indicar que A piensa que B es popular. Dado que la popularidad es transferible, si A piensa que B es popular y B piensa que C es popular, A también pensará que C es popular, incluso si esta no es una regla muy clara. Su tarea es contar el número de vacas que agradan a todas las demás vacas.

entrar

En la primera línea, dos números, N y M. Las líneas 2 ~ M + 1 tienen dos números en cada línea, A y B, lo que indica que A piensa que B es popular.

Salida

Un número, el número de vacas consideradas populares por todas las demás vacas.

Muestra de entrada

3
1 2
2 1
2 3

Salida de muestra

1

Descripción de la muestra

La vaca No. 3 es la única considerada famosa por todas las demás vacas.

Descripción

Límite del rango de datos
1 <= N <= 10, 000 1 <= N <= 10,0001<=norte<=1 0 ,0 0 0
1 <= M <= 50, 000 1 <= M <= 50,0001<=METRO<=5 0 ,0 0 0

análisis

O (n 2) O (n ^ 2) O ( n2 ) ¡Más de un millón que puedo ser yo! ?

Conecte los bordes directamente a la mesa adyacente y luego busque cada vaca vinculada a ella. Si el número llega a n-1, significa que ta es una vaca POPULAR.
Luego agréguelo a la matriz ans, y finalmente cuente la matriz ans

Subir código

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

Terminé esta pregunta sin problemas AK.

Supongo que te gusta

Origin blog.csdn.net/dglyr/article/details/109352409
Recomendado
Clasificación