Si desea determinar si el DAG, usando clasificación topológica es una opción buena, pero este problema se puede eliminar un borde
Si realmente tonto difícil enumerar borrado la parte superior
Hay que pensar, para el borrado de bordes, de hecho, el grado de -1, y sabemos que puede eliminar la topología completa, lo que indica el éxito, siempre y cuando el punto de la enumeración de la topología de la operación de correr de nuevo, será capaz de AC
Esta transformación es muy interesante, tenemos que pensar en la corrección, para un primer anillo, sin duda a una determinada situación porque todos penetración no son 0, por lo que el aumento no es en la cola. Como para el punto en el anillo, que luego terminar los bordes de descanso de la topología del anillo, la penetración de -1, que corresponde a
Ignorando el borde en el anillo, en el éxito de la rotura, y si hay dos anillos en este punto, todavía es inútil, porque no hay penetración de menos completa
#include <iostream> #include <cstring> #include <cstdio> #include <mapa> #include <algoritmo> #include <cola> #include < set > #define ULL unsigned long long utilizando espacio de nombres std; typedef largo largo ll; typedef par < int , int > pll; const int N = 1e5 + 10 ; int en [N], in1 [N]; vector < int > g [N]; En tnorte; bool topo () { cola < int > q; int i; int suma = 0 ; para (i = 1 ; i <= n; i ++ ) { si (! en [i]) q.push (i); } Mientras que (q.size ()) { int t = q.front (); q.pop (); Resumiendo ++ ; para (i = 0 ; i <G [t] .size (); i ++ ) { int j = g [t] [i]; en [j] -; si (! en [j]) q.push (j); } } Si (suma == n) regresar verdadera ; volver falsa ; } Int main () { int i; int m; cin >> n >> m; para (i = 1 ; i <= m; i ++ ) { int u, v; scanf ( " % d% d " , & u, y v); g [u] .push_back (v); en [v] ++ ; in1 [v] ++ ; } Si (topo ()) { cout << " SÍ " << endl; volver 0 ; } Más { para (i = 1 ; i <= n; i ++ ) { memcpy ( en , in1, sizeof en ); si ( en [i]> = 1 ) { en [i] - ; si (topo ()) { cout << " SÍ " << Endl; retorno 0 ; } } } } cout << " NO " << endl; retorno 0 ; }