Simulación 3
6.POPULAR
Límite de tiempo: 5000MS
Límite de memoria: 256000KB
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 con N (1 <= N <= 10,000) vacas, dé M (1 <= M <= 50,000) dos tuplas (A, B), lo que indica que A piensa que B es popular. Dado que la popularidad es transferible, si A piensa que B es popular y B cree 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.
Ingrese 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.
Genere
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
El ejemplo muestra que la
vaca No. 3 es la única vaca considerada famosa por todas las demás vacas.
Explique que el
límite del rango de datos es
1 <= N <= 10,000;
1 <= M <= 50 000
Ideas para resolver problemas
Es decir, cada punto de violencia dfs
podrá llegar al punto + 1 y
finalmente juzgar cuántos puntos son n-1
. El número de puntos es la respuesta
Código 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;
}