HDU - 3592 Exposición Mundial (restricciones diferenciales)

tema Enlace

orden numérico individual n de pie en una fila, hay dos limitaciones:

1.A, B no sea superior a la distancia entre la c

La distancia entre 2.A, B es al menos c

preguntas plantilla restricción diferenciales, prestar atención a la distancia más larga modelo a utilizar el camino más corto a la solución

Para la clase 1 - d constreñido [B] -d [A] <= c, la A-> B establecer un borde peso valor c
para la clase 2 - constreñido d [B] -d [A] > = c , tienen d negada [a] -d [B] <= - c, el B-> establecer un valor de lado derecho -c una

Además, puesto que las propias limitaciones del sujeto, d [i + 1] -d [i]> = 0, + 1 para establecer una banda de cero por la i i

SPFA más corto + anillo prenda plazo, si no hay solución anillo negativa, si n es 1 es no alcanzable distancia puede ser infinito

1 #include <bits / STDC ++ h.>
 2  usando  espacio de nombres std;
3 typedef largo  largo ll;
4  const  int N = 1000 + 10 , mod = 1e9 + 7 , inf = 0x3f3f3f3f ;
5  int n, A, B, HD [N], ne, inq [N], vis [N], d [N];
6  struct E { int v, c, NXT;} e [( int ) 1E5 + 10 ];
7  void enlace ( int u, int v, int c) {e [ne] = {v, c, hd [u]}, hd [u] = ne ++ ;}
8 cola < int > q;
9  bool UPD ( int u, int ad) {
 10      si (d [u]> ad) {
 11          d [u] = ad;
12          si (! {Inq [u])
 13              q.push (u), inq [u] = 1 , vis [u] ++ ;
14              si (vis [u]> n) de retorno  0 ;
15          }
 16      }
 17      de retorno  1 ;
18  }
 19  int SPFA () {
 20      mientras(q.size ()) q.pop ();
21      para ( int i = 1 ; i <= n; ++ i) d [i] = inf, inq [i] = vis [i] = 0 ;
22      UPD ( 1 , 0 );
23      , mientras que (q.size ()) {
 24          int u = q.front ();
25          q.pop (), inq [u] = 0 ;
26          para ( int i = hd [u]; ~ i; i = e [i] .nxt) {
 27              int v = e [i] .v, c = e [i] .c;
28              si (UPD (v, d [u] + c)!) De retorno - 1 ;
29          }
30      }
 31      de retorno d [n] == inf -? 2 : d [n];
32  }
 33  int main () {
 34      int T;
35      para (scanf ( " % d " , & T); T_in ;) {
 36          memset (HD, - 1 , sizeof hd), ne = 0 ;
37          scanf ( " % d% d% d " , y n, y A, y B);
38          para ( int i = 0 ; i <A; ++ i) {
 39              int u, v, c;
40              scanf ( " % d% d% d " , & u, y v, y c);
41              enlace (u, v, c);
42          }
 43          para ( int i = 0 ; i <B; ++ i) {
 44              int u, v, c;
45              scanf ( " % d% d% d " , & u, y v, y c);
46              enlace (v, u, - c);
47          }
 48          para ( int i = 1 ; i <n; ++ i) enlace (i + 1 , i, 0 );
49         printf ( " % d \ n " , SPFA ());
50      }
 51      de retorno  0 ;
52 }

 

Supongo que te gusta

Origin www.cnblogs.com/asdfsag/p/12482582.html
Recomendado
Clasificación