Luo Gu P4017 topológica plantilla de clasificación

Los ejemplos Valle P4017 : HTTPS: //www.luogu.com.cn/problem/P4017

 

Buscando el número máximo de la cadena alimenticia, el mayor problema se ha dado en la definición de la cadena alimentaria, la cadena se puede convertir en un punto de partida definido es el punto de 0 grados, un punto de grado 0 como el punto final. Tenga en cuenta la red de alimentos abstracta de un grafo dirigido puede tener más.

Idea: Sólo una vez clasificación topológica, registro acumulativo dinámica sus respuestas a la salida final al número máximo acumulado hasta el final de la cadena alimentaria.

plantilla:

1  bool toposort () {
 2      Q = nueva cola ();
3      para (i = 0 ; i <n; i ++ )
 4          Si (in_deg [i] == 0 ) q.push (i);
5      ans = nuevo vector ();
6      , mientras que (! Q.empty ()) {
 7          u = q.pop ();
8          ans.push_back (u);
9          para cada borde (u, v) {
 10              si (--in_deg [v] == 0 ) q.push (v);
11          }
 12      }
 13     si (ans.size () == n) {
 14          para (i = 0 ; i <n; i ++ )
 15              std :: cout << ans [i] << std :: endl;
16          volver  verdadero ;
17      } demás {
 18          de retorno  falsa ;
19      }
 20 }

 

Código de CA:

1 #include <bits / STDC ++ h.>
 2  usando  espacio de nombres std;
3 typedef largo  largo ll;
4  const  int maxN = 5E3 + 5 ;
5  const ll mod = 80112002 ;
6  struct nodo {
 7      vector < int > v;
8      int  en , hacia fuera ;
9  } g [maxN];
10  int n, m;
11  ans ll [maxN];
12  void add ( int u,int v) {
 13      g [v] .v.push_back (u);
14      g [v]. fuera ++, g [u]. en ++ ;   
15  }
 16  void toposort () {
 17      cola < int > q;
18      para ( int i = 1 ; i <= n; i ++) si (g [i]!. En ) q.push (i), ans [i] = 1 ;
19      , mientras que (! {Q.empty ())
 20          int cur = q.front ();
21          q.pop ();
22          para (int i = 0 ; i <g [cur] .v.size (); i ++ ) {
 23              int u = g [cur] .v [i];
24              ans [u] = (ans [u] + ans [cur])% mod;
25              Si (--g [u]. En == 0 q.push (u));  
26          }
 27      }
 28  }
 29  int main () {
 30      scanf ( " % d% d " , y n, y m);
31      para ( int i = 1 ; i <= m; i ++ ) {
 32          int u, v;
33         scanf ( " % d% d " , & u, y v);
34          add (u, v);
35      }
 36      toposort ();
37      res ll = 0 ;
38      para ( int i = 1 ; i <= n; i ++ ) {
 39          si (g [i]!. Cabo ) res = (res + ans [i])% mod;
40      }
 41      tribunal << res;
42      de retorno  0 ;
43 }

 

Supongo que te gusta

Origin www.cnblogs.com/AaronChang/p/12598547.html
Recomendado
Clasificación