Casi CF915D acíclica Gráfico (+ pensamiento topología)

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 << " " << 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 << "  " << Endl;
                     retorno  0 ; 
                } 
            } 
        } 
    } 
    cout << " NO " << endl;
     retorno  0 ; 
}
Ver código

 

Supongo que te gusta

Origin www.cnblogs.com/ctyakwf/p/12633734.html
Recomendado
Clasificación