Graph Theory 7- sistema de retención diferencial

Lo sentimos un conocimiento de la teoría de grafos, dos días hizo más y más una restricción diferencia en la actualidad, lo que es más útil ahora.

¿Qué sistema de retención diferencia es? Teniendo en cuenta algunas de las limitaciones, y luego encontrar que hay / no está en línea con los valores de las restricciones para cada elemento, por supuesto, también ser capaz de contar un valor específico es.

Por cierto, antes de leer este blog para aprender algoritmo SPFA. Un ejemplo: luoguP1993

efecto Título: hay n variables, y alguna condición relación, cada relación entre las condiciones están conformados como sigue: a> = b + x, a <= b + x o a = b, x es una constante, Q la condición relación si hay contradicciones.

Analizar la restricción diferencial: las limitaciones y la diferencia está en la forma de condiciones de restricción como la solución del problema, tales como a> = b + x, ver esto, no hay pensamiento de dis actualización [y] ecuación SPFA es

dis [y] <= dis [x] + val [i]? Si hay un <= b + x no es capaz de construir un camino de A a B, el valor de peso x, entonces el plazo más corto en la línea. Si el lado de la pieza de construcción no entiende bien

Puede ver más adelante ese cuadro, explica claramente el lado de la construcción del sistema de retención diferencial.

Después de leer esta cifra debemos entender los principios de la construcción de las limitaciones laterales del diferencial, pero hay un lado la clase a> = b + x cómo construirla? Muy buena racha, crea una transformación matemática en b <= a + (- x),

No estás ahora ser edificado? -X construido sobre un lado de la longitud de la línea de A a B. Pero esta pregunta es para determinar si se estableció un poco más difícil, cómo llamar a no sostenerlo? No es que

Comience con un> = b + x decir a <= b + y e y <x, vistazo a la más corta, se construye primero a-> b, acumulación -x B-> A, Y, y porque y <x Por lo tanto yx <0 lo que este será un anillo negativo

Hay varios que se establecieron no producirá un resultado negativo en el anillo, por lo que puede utilizar SPFA condenados a una ola de anillo negativo, si hay un bucle negativo, la salida de NO, de lo contrario la salida SÍ. Código es el siguiente:

<. bits / STDC ++ h> #include
 #define xms cte
 #define int largo tiempo
 usando  espacio de nombres std;
const  int NR = 10005 ;
const  int INF = 1e18 + 10 ;
int n, m, s;
int read () 
{ 
    int x = 0 , f = 1 ; Char ch = getchar ();
    mientras que (ch < ' 0 ' || ch> ' 9 ' ) { Si (CH == ' - ' ) f = - 1; ch = getchar ();}
     , mientras que (CH> = ' 0 ' && ch <= ' 9 ' ) {x = (x << 1 ) + (x << 3 ) + (ch ^ 48 ); ch = getchar ( );}
     retorno x * f; 
} 
Int a [NR * 3 ], NXT [NR * 3 ], val [NR * 3 ];
int cabeza [NR];
int tot = 1 ;
void add ( int x, int y, int z) 
{ 
    a [tot] = y;
    val [tot] = z; 
    NXT [tot] = cabeza [x]; 
    cabeza [x] = tot ++ ; 
} 
Bool bandera = 0 ;
int dis [NR], cnt [NR];
int CNT2 [NR];
bool vis [NR];
void SPFA () 
{ 
    para ( int i = 0 ; i <= n; i ++) dis [i] = - 1e18; 
    cola < int > q; 
    q.push (s); 
    vis [s] = 1 , dis [s] = 0 ;
    mientras que (! q.empty ()) 
    {
         int x =q.front (); 
        q.pop (); 
//         tribunal << x << endl; 
        CNT2 [x] ++ ; 
        vis [x] = 0 ;
        si (CNT2 [x]> = n) 
        { 
            bandera = 1 ;
            volver ; 
        } 
        Para ( int i = cabeza [x]; i; i = NXT [i]) 
        { 
            int y = a [i];
            si (dis [Y] <dis [x] + val [i]) 
            { 
                
                dis [y] = dis [x] + val [i]; 
                si (!  vis [y])
                {
                     Q.push (y); 
                    vis [y] = 1 ; 
                } 
            } 
        } 
    } 
} 
Firmado main () 
{ 
//     freopen ( "farm.in", "r", la entrada estándar);
//     freopen ( "farm.out", "w", stdout); 
    n = read (), m = read ();
    para ( int i = 1 ; i <= m; i ++ ) 
    { 
        int op; 
        op = read ();
        si (op == 1 ) 
        { 
            int a = read (), b = read (), c =leer(); 
            añadir (a, b, c); 
        }
         Si (op == 2 ) 
        { 
            int a = read (), b = read (), c = read (); 
            añadir (b, a, - c); 
        }
         Si (op == 3 ) 
        { 
            int a = read (), b = leer (); 
            añadir (a, b, 0 ); 
            añadir (b, a, 0 ); 
        } 
    } 
    Para ( int i = 1 ; i <= n; i ++) add ( 0 , i, 0 ); 
    SPFA (); 
    Si (bandera!) puts ( " " );
    else puts ( " No " ); 
    volver  0 ; 
}

Tenga en cuenta que debe abrir O2 presentación de optimización Los Valley o Valle de Los BFS tarjetas de versión de SPFA

 

Luego, basándose en las limitaciones diferenciales terminado, y ahora en términos de algunos de los avanzados.

Si usted encuentra que esta restricción no es tan fácil como hacerlo? Permítanme recomendar una pregunta: POJ1275

efecto Título: Hay un supermercado 24 horas, por hora requiere un mínimo de un empleados [I], hay n (n <= 1000) a un candidato, cada persona tiene un parámetro x, representa de después de las primeras x 8 horas

Esta persona puede trabajar, preguntar cómo muchas personas están contratando para cumplir con los requisitos. Si no está satisfecho, la solución Sin salida.

Análisis Tema: Esta pregunta no es para decir que si la diferencia no está vinculado por ese mismo pensamiento ah? Esta pregunta es cómo diferenciales limitaciones que? Para determinar qué nodo es el primero, y luego pensar en cualquier otra cosa. Utilizamos una serie de s

Y representa un prefijo, S [i] representa el número de trabajadores, hasta que todos fácilmente disponibles en el día i s [i] -s [I-8]> = a [i], pero cuando i <7, los tres se la desigualdad, con el fin de resolver este problema, podemos

Los pedazos de s [23], y se convierten en la desigualdad diádica i <7, y luego hacer SPFA en la línea. Sugiero que no se ven en el código, escribir sobre sí mismos esta pregunta.

Pero puse el código de aquí ahora

 

#include <bits / STDC ++ h.> 
using namespace std; 
const int NR = 105; 
const int MR = 2E3 + 10; 
int n; 
int a [NR], num [NR]; 
int a [MR], NXT [MR], val [MR]; 
int cabeza [NR]; 
int tot = 1; 
add void (int x, int y, int z) 
{ 
	a [tot] = y; 
	val [tot] = z; 
	NXT [tot] = cabeza [x]; 
	cabeza [x] = tot ++; 
} 
Int leer () 
{ 
	int x = 0, f = 1; Char ch = getchar (); 
	while (ch> '9' || ch < '0') {if (ch == '-') f = -1; ch = getchar ();} 
	while (ch <= '9' && ch> = '0 ') {x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar ();} 
	return x * f; 
} 
Bool vis [NR]; 
dis int [NR];
	memset (cabeza, 0, sizeof (cabeza)); 
	memset (vis, 0, sizeof (vis)); 
	memset (dis, -0x3f, sizeof (dis)); 
} 
Void acumulación (int x) 
{ 
	for (int i = 0; i <= 23; i ++) 
	{ 
		add (i, i + 1,0); 
		añadir (i + 1, i, -num [i]); 
	} 
	For (int i = 7; i <= 23; i ++) add (i-7, i + 1, a [i]); 
	añadir (0,24, x), añadir (24,0, -x); 
	for (int i = 0; i <= 6; i ++) add (i + 17, i + 1, a [i] -x); 
} 
Cheque bool (int x) 
{ 
	Init (); 
	build (x); 
	cola <int> q; 
	q.push (0), dis [0] = 0, vis [0] = 1; 
	(! q.empty ()), mientras que 
	{ 
		int ahora = q.front (); q.pop (); vis [ahora] = 0; 
		si (ahora == 24 && dis [ahora]> x) volver 0; 
		for (int i = cabeza [ahora]; i; i = NXT [i])
		{ 
			Int y = a [i]; 
			si (dis [y] <dis [ahora] + val [i]) 
			{ 
				dis [y] = dis [ahora] + val [i]; 
				si (vis [y]!) 
				{ 
					q.push (y); 
					vis [y] = 1; 
				} 
			} 
		} 
	} 
	Dis de retorno [24] == x; 
} 
Void resolver () 
{ 
	int ans = -1; 
	for (int i = 0; i <= n; i ++) 
	{ 
		si (cheque (i)) 
		{ 
			ans = i; 
			descanso; 
		} 
	} 
	Si (ANS <0) puts ( "no hay solución"); 
	más printf ( "% d \ n", ans); 
} 
Int main () 
{ 
// freopen ( "1.in", "r", la entrada estándar); 
// freopen ( "1.out", "w",
	int T = leer (); 
	while (T-) 
	{ 
		memset (num, 0,
		for (int i = 0; i <= 23; i ++) 
		{ 
			a [i] = read (); 
		} 
		N = read (); 
		for (int i = 1; i <= n; i ++) 
		{ 
			int x = read (); 
			num [x] ++; 
		} 
		Resolver (); 
	} 
	Return 0; 
}

 

  

 

Supongo que te gusta

Origin www.cnblogs.com/chen-1/p/12608187.html
Recomendado
Clasificación