P1396 Rescue + ruta más corta

Algoritmo

Ruta más corta + variante

Ideas

Pensemos en ello detenidamente: para cualquier punto, el valor mínimo para su grado máximo de congestión debe ser el valor de un punto adyacente y el peso del borde entre ellos. min!

 

De esta manera, podemos pensar siempre que la holgura en el tablero esté ligeramente modificada, es decir, solo la suma original debe cambiarse al máximo para estar bien.

 

Además, tenga en cuenta que esta pregunta debe construir un gráfico no dirigido. !

Código

#include <cstdio> 
#include <algorithm> 
#include <cstring> 
#include <queue> 
usando el espacio de nombres std; 

const int M = 30001; 
inline int read () { 
    int ret; bool flag = 0; char c; 
    while ((c = getchar ()) <'0' || c> '9') flag ^ =! (c ^ '-'); ret = c ^ 48; 
    while ((c = getchar ())> = '0' && c <= '9') ret = (ret << 3) + (ret << 1) + (c ^ 48); 
    bandera de retorno? -ret: ret; 
} 

cola <int> Q; 
int fir [M >> 1], nex [M], ir [M], val [M]; 
int dis [M >> 1], vis [M >> 1]; 
int n, m, a, b, tot; 

inline void add_edge (int x, int y, int z) 
{ 
    nex [++ tot] = fir [x], fir [x] = tot, go [tot] = y, val [tot] = z;


    n = leer (); m = leer (); a = leer (); b = leer (); 
    para (int i = 1; i <= m; i ++) 
    { 
        int x, y, z; 
        x = leer (); y = leer (); z = leer (); 
        add_edge (x, y, z); 
        add_edge (y, x, z); 
    } 
    para (int i = 1; i <= n; i ++) dis [i] = 1e9 + 7; 
    dis [a] = 0; 
    Q.push (a); 
    vis [a] = 1; 
    while (! Q.empty ()) 
    { 
        int Now = Q.front (); 
        Q.pop (); 
        int Go; 
        vis [Ahora] = 0; 
        for (int i = fir [Now]; i, Go = go [i]; i = nex [i]) 
        { 
            if (dis [Go]> max (dis [Now], val [i])) 
            {
                dis [Go] = max (dis [Ahora], val [i]); 
                if (! vis [Go]) Q.push (Go), vis [Go] = 1; 
            } 
        } 
    } 
    if (dis [b] == 1e9 + 7) dis [b] = -1; 
    printf ("% d", dis [b]); 
    devuelve 0; 
}

  

  

 

# include <cstdio> # include <algorithm> # include <cstring> # include <queue> usando el espacio de nombres std; const int M = 30001 ; inline int read () { int ret; bandera bool = 0 ; char c; while ((c = getchar ()) < '0' || c> '9' ) flag ^ =! (c ^ '-' ); ret = c ^ 48 ; while ((c = getchar ())> = '0' && c <) ret = (ret << 3 ) + (ret << 1 ) + (c ^ 48 ); bandera de retorno ? -ret: ret; } cola < int > Q; int fir [M >> 1 ], nex [M], ir [M], val [M]; int dis [M >> 1 ], vis [M >> 1 ]; int n, m, a, b, tot; inline void add_edge ( int x, int y, int z) {nex [++ tot] = fir [x], fir [x] = tot, go [tot] = y, val [tot] = z; } int main ( void ) {n = read (); m = read (); a = read (); b =leer (); para ( int i = 1 ; i <= m; i ++) { int x, y, z; x = leer (); y = leer (); z = leer (); add_edge (x, y, z); add_edge (y, x, z); } para ( int i = 1 ; i <= n; i ++) dis [i] = 1e9 + 7 ; dis [a] = 0 ; Q.push (a); vis [a] = 1 ; while (! Q.empty ()) { int Now = Q.front (); Q.pop (); int Go; vis [Ahora] = 0 ; para ( inti = abeto [Ahora]; i, Go = ir [i]; i = nex [i]) { if (dis [Go]> max (dis [Now], val [i])) {dis [Go] = max (dis [Ahora], val [i]); if (! vis [Go]) Q.push (Go), vis [Go] = 1 ; }}} if (dis [b] == 1e9 + 7 ) dis [b] = -1 ; printf ( "% d" , dis [b]); devuelve 0 ; }

Supongo que te gusta

Origin www.cnblogs.com/ruanmowen/p/12727645.html
Recomendado
Clasificación