Componentes fuertemente conectados de gráficos dirigidos --- Vacas populares

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;
} 
164 artículos originales publicados · Me gusta 112 · Visitas 6758

Supongo que te gusta

Origin blog.csdn.net/qq_45772483/article/details/105603569
Recomendado
Clasificación