Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
EVIDENCIA DE APRENDIZAJE
ALUMNA: YAZMIN GUADALUPE CASTILLO ORTIZ
MATRICULA: ES1821000588
0
Introducción
1
Teorema del Corte Mínimo y Flujo Máximo
Pseudocódigo
Paso 1.
Flujo máximo y corte mínimo.
Paso 2.
Entradas: El número de vértices (vertice) y el número de aristas (aristas), vértice de inicio o fuente “fuente” y
el vértice final, sumidero o destino “destino”, valores de la red: vértices de “p[]” a “q[]”; la capacidad de cada
arista “cap[]”.
Salidas: cantidad de flujo de cada vértice “flujovertice[]”, cantidad de flujo por cada arista “flujoarista[]”,
vértices del corte mínimo “cortemin[]”.
1. Inicio.
2. Inicialización de variables
Cortemin [vertice+1] ← 0
Flujovertice [vertice+1] ← 0
Flujoarista [aristas+aristas+1] ← 0
Primarista [vertice+1] ← 0
Mapeoi [vertice+1] ← 0
Mapeoj [vertice+1] ← 0
flujo← 0, aux← 0, aristas2 ← 0, NY ← 0, i ← 0, j ← 0
entrada← 0, salida ← 0, parm← 0, aristas1 ← 0, cont1 ← 0, cont2 ← 0
fin← 0, NP ← 0, NQ ← 0, NU ← 0, NV ← 0, NW ← 0, NX ← 0
termino←false, A ←false, B ←false, C ←false, G ←false
D ←false, E ←false, F ←false.
3. Se empieza con un preflujo en donde las aristas de la fuente tienen una capacidad residual de cero,
produciendo excesos en los vértices adyacentes a la fuente.
4. Mientras el flujo de entrada sea igual al flujo de salida del vértice Los excesos son conducidos hasta el
destino Si los excesos no alcanzan a llegar al destino, son regresados a la fuente.
6. Fin
Ejemplo
2
Código
/******************************************************************************
*******************************************************************************/
package maxflow;
int cap[] = {0, 6, 8, 4, 8, 3, 2, 14, 3, 10, 1, 10, 10, 12, 6, 8, 9, 10, 12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
Maxflow.FlujoMaxCorteMin(vertice,aristas,p,q,cap,fuente,destino,cortemin,flujoarista,flujovertice);
if (cortemin[i] == 1)
System.out.printf("%4d%7d\n",i,flujovertice[i]);
3
for (int i = 1; i<= flujoarista[0]; i++)
System.out.printf("%2d%6d%7d\n",p[i],q[i],flujoarista[i]);
///////////////////////////////////
//package maxflow;
//valores de retorno
int fin = 0, NP = 0, NQ = 0, NU = 0, NV = 0, NW = 0, NX = 0;
boolean termino, A, B, C, G;
j = aristas;
j++;
p[aristas+i] = q[i];
4
q[aristas+i] = p[i];
cap[aristas+i] = 0;
// Inicialización
primarista[i] = 0;
flujo = 0;
flujoarista[i] = 0;
j = p[i];
if (j == fuente)
flujo += cap[i];
primarista[j]++;
flujovertice[fuente] = flujo;
NY = 1;
j = primarista[i];
primarista[i] = NY;
mapeoi[i] = NY;
NY += j;
termino = false;
A = true;
5
// Ordenamiento de aristas en orden lexicográfico
etiqueta1:
while (true)
aux = 0;
B = false;
etiqueta2:
while (true)
if (!B) {
if (aux != -1) {
NQ = cont2;
cont2 = NP;
aux = -1; }
else {
if (NY <= 0) {
if (cont1 > 1) {
cont1--;
cont2 = cont1;
A = false;
continue etiqueta2; }
if (aristas1 == 1)
aux = 0;
else {
NP = aristas1;
6
aristas1--;
NQ = 1;
aux = 1;
else aux = 2;
else {
if (A)
if (aux > 0) {
A = false;
if (A) {
aristas1 = aristas;
cont1 = 1 + aristas / 2;
cont1--;
cont2 = cont1;
A = true;
NP = cont2 + cont2;
NQ = NP + 1;
aux = -2;
else {
if (NP == aristas1) {
NQ = cont2;
7
cont2 = NP;
aux = -1;
else {
if (cont1 > 1) {
cont1--;
cont2 = cont1;
A = false;
continue etiqueta2;
if (aristas1 == 1)
aux = 0;
else {
NP = aristas1;
aristas1--;
NQ = 1;
aux = 1;
G = false;
C = false;
NY = p[NP] - p[NQ];
continue etiqueta2; }
else {
8
if ((aux > 0) || B) {
B = false;
NY = p[NP];
p[NP] = p[NQ];
p[NQ] = NY;
flujo = cap[NP];
cap[NP] = cap[NQ];
cap[NQ] = flujo;
NY = q[NP];
q[NP] = q[NQ];
q[NQ] = NY;
flujo = flujoarista[NP];
flujoarista[NP] = flujoarista[NQ];
flujoarista[NQ] = flujo;
if (aux> 0)
continue etiqueta2;
if (aux == 0) {
C = true;
else {
mapeoj[NV] = NQ;
G = true;
else
if (termino)
9
j = 0;
if (flujoarista[i] > 0) {
j++;
p[j] = p[i];
q[j] = q[i];
flujoarista[j] = flujoarista[i];
flujoarista[0] = j;
return;
NV = q[i];
p[i] = mapeoi[NV];
mapeoi[NV]++;
etiqueta3:
while (true) {
if (!G) {
if (!C) {
aux = 0;
if (i != fuente)
flujovertice[i] = 0;
10
mapeoj[i] = aristas + 1;
cortemin[i] = 0;
entrada = 0;
salida = 1;
mapeoi[1] = fuente;
cortemin[fuente] = -1;
while (true)
entrada++;
break;
NU = mapeoi[entrada];
aristas2 = mapeoj[NU] - 1;
fin = primarista[NU] - 1;
while (true) {
fin++;
break;
NV = q[fin];
continue;
if (NV != destino) {
salida++;
mapeoi[salida] = NV;
cortemin[NV] = -1;
11
}
if (cortemin[destino] == 0)
// Salidas
cortemin[i] = -cortemin[i];
NU = q[p[i]];
if (flujoarista[i] < 0)
flujovertice[NU] -= flujoarista[i];
p[i] = NU;
flujovertice[fuente] = flujovertice[destino];
termino = true;
continue etiqueta1;
cortemin[destino] = 1;
while (true) {
if (!C) {
entrada--;
if (entrada == 0) break;
NU = mapeoi[entrada];
NP = primarista[NU] - 1;
NQ = mapeoj[NU] - 1; }
C = false;
NV = q[NQ];
12
if ((cortemin[NV] <= 0) ||(cap[NQ] == flujoarista[NQ])) {
NQ--;
continue;
else {
q[NQ] = -NV;
cap[NQ] -= flujoarista[NQ];
flujoarista[NQ] = 0;
NP++;
p[p[NP]] = NQ;
p[p[NQ]] = NP;
B = true;
continue etiqueta2;
break;
cortemin[NU] = NP;
NW = 0;
if (cortemin[mapeoi[i]] > 0) {
NW++;
mapeoi[NW] = mapeoi[i];
13
aux = -1;
NX = 1;
etiqueta4:
while (true) {
if (!G) {
if (!F) {
NU = mapeoi[NX];
if ((flujovertice[NU] <= 0) || D || E) {
if (!E) {
D = false;
NX++;
parm = 0;
E = false;
NX--;
if (NX != 1) {
NU = mapeoi[NX];
if (flujovertice[NU] < 0) {
E = true;
continue etiqueta4;
if (flujovertice[NU] == 0)
//Flujos acumulados
aristas2 = aristas + 1;
if (NU <vertice)
14
aristas2 = primarista[NU + 1];
fin = mapeoj[NU];
mapeoj[NU] = aristas2;
while (true) {
if (fin == aristas2) {
E = true;
continue etiqueta4;
j = p[fin];
flujo = flujoarista[j];
flujoarista[j] = 0;
cap[j] -= flujo;
flujoarista[fin] -= flujo;
fin++;
if (primarista[NU] >cortemin[NU])
fin = mapeoj[NU];
do {
j = p[fin];
flujo = flujoarista[j];
flujo = flujovertice[NU];
flujoarista[j] -= flujo;
flujovertice[NU] -= flujo;
NV = q[fin];
flujovertice[NV] += flujo;
fin++;
15
}
flujovertice[NU] = -1;
fin = cortemin[NU] + 1;
{ NV = -q[i];
if (NV >= 0) {
q[i] = NV;
j = p[i];
cap[i] -= flujoarista[j];
flujoarista[i] = flujo;
flujoarista[j] = -flujo;
continue etiqueta3;
fin = cortemin[NU] + 1;
while (true) {
if (!G) {
F = false;
fin--;
16
if (fin <primarista[NU])
break;
NV = -q[fin];
if (flujovertice[NV] < 0)
continue;
flujo = flujovertice[NU];
flujoarista[fin] += flujo;
flujovertice[NU] -= flujo;
flujovertice[NV] += flujo;
parm = 1;
NP = p[fin];
NQ = mapeoj[NV] - 1;
p[p[NP]] = NQ;
p[p[NQ]] = NP;
B = true;
continue etiqueta2;
if (NP == NQ)
mapeoj[NV] = NQ; }
G = false;
if (flujovertice[NU] > 0)
continue;
break;
cortemin[NU] = fin;
17
if (parm != 0) { D = true;
continue etiqueta4;
fin = mapeoj[NU];
do { j = p[fin];
flujo = flujoarista[j];
flujoarista[j] -= flujo;
flujovertice[NU] -= flujo;
NV = q[fin];
flujovertice[NU] = -1;
E = true;
continue etiqueta4;
18
Problemas de compilación
https://www.onlinegdb.com/online_c_compiler
https://www.compilejava.net/
19
https://www.jdoodle.com/online-java-compiler/
He estado revisando sobre los errores que me aparecen yo creo que al tener 2 clases debo tenerlo
en 2 archivos, pero mis compiladores en línea, solo manejan un archivo por ello no están
considerando la otra clase y me marca el error.
Interpretación:
Bibliografía
Anonimo. (-- de -- de --). Compilador de Java. Obtenido de https://www.compilejava.net/
20
21