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 }