Luo Gu P4017 topológica modelo de classificação

Los exemplos Vale P4017 : HTTPS: //www.luogu.com.cn/problem/P4017

 

Procurando o número máximo da cadeia alimentar, o maior problema que tem sido dada na definição da cadeia alimentar, a cadeia pode ser convertido para um ponto de partida definidos é o ponto de 0 graus, de um ponto de grau 0, quando o ponto final. Observe a web de alimentos abstrata de um grafo dirigido pode ter mais.

Idéia: Só uma vez ordenação topológica, registro cumulativo dinâmica as suas respostas para a saída final para o número máximo cumulativo até o fim da cadeia alimentar.

Template:

1  boleano toposort () {
 2      q = nova fila ();
3      para (i = 0 ; i <n; i ++ )
 4          se (in_deg [i] == 0 ) q.push (i);
5      ans = novo vector ();
6      enquanto (! Q.empty ()) {
 7          u = q.pop ();
8          ans.push_back (u);
9          para cada ponta (u, v) {
 10              se (--in_deg [v] == 0 ) q.push (v);
11          }
 12      }
 13     se (ans.size () == n) {
 14          para (i = 0 ; i <n; i ++ )
 15              std :: cout << ans [i] << std :: endl;
16          retornar  verdadeiro ;
17      } else {
 18          return  false ;
19      }
 20 }

 

Código AC:

1 #include <bits / STDC ++ h.>
 2  usando  namespace std;
3 typedef long  long ll;
4  const  int maxn = 5E3 + 5 ;
5  const ll mod = 80112002 ;
6  struct nó {
 7      vector < int > v;
8      int  em , para fora ;
9  } g [maxn];
10  int n, m;
11  ans ll [maxn];
12  vazio add ( int u,int v) {
 13      g [v] .v.push_back (u);
14      g [v]. fora ++, g [u]. em ++ ;   
15  }
 16  vazio toposort () {
 17      fila < int > q;
18      para ( int i = 1 ; i <= n; i ++) se (g [i]!. Na ) q.push (i), ans [i] = 1 ;
19      , enquanto (! {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              se (--g [u]. Em == 0 q.push (u));  
26          }
 27      }
 28  }
 29  int main () {
 30      scanf ( " % d% d " , e n, e m);
31      para ( int i = 1 ; i <= m; i ++ ) {
 32          int u, v;
33         scanf ( " % d% d " , & u, e v);
34          add (u, v);
35      }
 36      toposort ();
37      ll res = 0 ;
38      para ( int i = 1 ; i <= n; i ++ ) {
 39          se (g [i]!. A ) res = (res + ans [i])% mod;
40      }
 41      cout << res;
42      retorno  0 ;
43 }

 

Acho que você gosta

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