El deseo de cada vaca es convertirse en la vaca más popular. NN ahora
Cabeza de vaca, numerada del 11
A NN
, Darle MM
Para enteros (A, B) (A, B)
, Indicando vaca AA
Think Cow BB
Popular Esta relación es transitiva si AA
Piensa BB
Bienvenido BB
Piensa CC
Popular, luego vaca AA
Piense también en el ganado CC
Popular Su tarea es descubrir cuántas vacas son consideradas populares por todos menos por usted. Dos números en la primera línea del formato de entrada N, MN, M
; Siguiente MM
Filas, dos números por fila A, BA, B
Significado AA
Piensa BB
Es bienvenido (la información dada puede repetirse, es decir, puede haber múltiples A, BA, B
) El formato de salida genera la cantidad de ganado que se considera popular por todo el ganado excepto usted. Rango de datos 1≤N≤1041≤N≤104
,
1≤M≤5 × 1041≤M≤5 × 104
Entrada de muestra: 3 3
1 2
2 1
2 3
Salida de muestra: El ejemplo 1
explica que solo la tercera vaca es considerada popular por todos menos el otro ganado.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10010, M = 50010;
int n, m;
int h[N], e[M], ne[M], idx;
int dfn[N], low[N], timestamp;
int stk[N], top;
bool in_stk[N];
int id[N], scc_cnt, Size[N];
int dout[N];
void add(int a, int b){
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
void tarjan(int u){
dfn[u] = low[u] = ++ timestamp;
stk[ ++ top] = u, in_stk[u] = true;
for (int i = h[u]; ~i; i = ne[i]){
int j = e[i];
if (!dfn[j]){
tarjan(j);
low[u] = min(low[u], low[j]);
}
else low[u] = min(low[u], dfn[j]);
}
if (dfn[u] == low[u]){
++ scc_cnt;
int y;
do{
y = stk[top --];
in_stk[y] = false;
id[y] = scc_cnt;
Size[scc_cnt] ++;
}while(y != u);
}
}
int main(){
scanf("%d%d", &n, &m);
memset(h, -1, sizeof h);
while(m --){
int a, b;
scanf("%d%d", &a, &b);
add(a, b);
}
for (int i = 1; i <= n; i ++)
if (!dfn[i])
tarjan(i);
for (int i = 1; i <= n; i ++)
for (int j = h[i]; ~j; j = ne[j]){
int k = e[j];
int a = id[i], b = id[k];
if (a != b) dout[a] ++;
}
int zeros = 0, sum = 0;
for (int i = 1; i <= scc_cnt; i ++)
if (!dout[i]){
zeros ++;
sum += Size[i];
if (zeros > 1){
sum = 0;
break;
}
}
cout << sum << endl;
return 0;
}