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.