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 }