@let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um...

73

Transcript of @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um...

Page 1: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Melhores momentos

AULA 24

Page 2: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Caminho de aumento

Um caminho de aumento (= augmenting path) éum pseudo-caminho do vértice inicial ao �nal onde:

I os arcos diretos não estão cheios eI os arcos inversos não estão vazios.

Page 3: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Exemplo

0

1

2

3

4

5

6

71/2

2/3

1/21/1

1/1

1/1

0/2

1/1

1/1

2/3

0/1

1/1

3/3

1/1

arcos diretos arco inverso

2/2

Page 4: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Enviar �uxo através de caminhos de aumento

A operação de enviar d unidades de �uxo ao longode um caminho de aumento consiste de:

I para cada arco direto, some d ao �uxoI para cada arco inverso, subtraia d do �uxo.

Page 5: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Exemplo

0

1

2

3

4

5

6

71/2

2/3

1/21/1

1/1

1/1

0/2

1/1

1/1

2/3

0/1

1/1

3/3

1/1

arcos diretos arco inverso

2/2

Page 6: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Exemplo

0

1

2

3

4

5

6

72/2

2/3

2/20/1

1/1

1/1

1/2

1/1

1/1

2/3

1/1

1/1

3/3

1/1

arcos diretos arco inverso

2/2

Page 7: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

0/3

0/7

0/5

0/5

0/2

0/3

0/9

0/1

0/1

0/6

int(f) = 0 f(a)/c(a)

Page 8: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

0/3

0/7

0/5

0/5

0/2

0/3

0/9

0/1

0/1

0/6

int(f) = 0 f(a)/c(a)

Page 9: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

0/3

1/7

0/5

1/5

0/2

0/3

0/9

0/1

1/1

0/6

int(f) = 1 f(a)/c(a)

Page 10: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

0/3

1/7

0/5

1/5

0/2

0/3

0/9

0/1

1/1

0/6

int(f) = 1 f(a)/c(a)

Page 11: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

0/3

2/7

0/5

1/5

0/2

0/3

0/9

1/1

1/1

1/6

int(f) = 2 f(a)/c(a)

Page 12: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

0/3

2/7

0/5

1/5

0/2

0/3

0/9

1/1

1/1

1/6

int(f) = 2 f(a)/c(a)

Page 13: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

1/3

2/7

1/5

1/5

1/2

0/3

0/9

1/1

0/1

1/6

int(f) = 3 f(a)/c(a)

Page 14: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

1/3

2/7

1/5

1/5

1/2

0/3

0/9

1/1

0/1

1/6

int(f) = 3 f(a)/c(a)

Page 15: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

2/3

2/7

1/5

1/5

1/2

1/3

0/9

0/1

0/1

1/6

int(f) = 4 f(a)/c(a)

Page 16: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

2/3

2/7

1/5

1/5

1/2

1/3

0/9

0/1

0/1

1/6

int(f) = 4 f(a)/c(a)

Page 17: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

2/3

2/7

1/5

1/5

1/2

3/3

0/9

0/1

0/1

3/6

int(f) = 6 f(a)/c(a)

Page 18: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

2/3

2/7

1/5

1/5

1/2

3/3

0/9

0/1

0/1

3/6

int(f) = 6 f(a)/c(a)

Page 19: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

3/3

2/7

2/5

1/5

1/2

3/3

1/9

0/1

0/1

3/6

int(f) = 7 f(a)/c(a)

Page 20: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

3/3

2/7

2/5

1/5

1/2

3/3

1/9

0/1

0/1

3/6

int(f) = 7 f(a)/c(a)

Page 21: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

3/3

3/7

2/5

1/5

1/2

3/3

1/9

1/1

0/1

4/6

int(f) = 8 f(a)/c(a)

Page 22: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

3/3

3/7

2/5

1/5

1/2

3/3

1/9

1/1

0/1

4/6

int(f) = 8 f(a)/c(a)

Page 23: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

3/3

3/7

3/5

2/5

2/2

3/3

1/9

1/1

0/1

4/6

int(f) = 9 f(a)/c(a)

Page 24: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

3/3

3/7

3/5

2/5

2/2

3/3

1/9

1/1

0/1

4/6

int(f) = 9 f(a)/c(a)

Page 25: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

3/3

4/7

3/5

3/5

2/2

3/3

1/9

1/1

1/1

4/6

int(f) = 10 f(a)/c(a)

Page 26: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

3/3

4/7

3/5

3/5

2/2

3/3

1/9

1/1

1/1

4/6

int(f) = 10 f(a)/c(a)

Page 27: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método de Ford-Fulkerson

0

2

3

4

5

1

3/3

4/7

3/5

3/5

2/2

3/3

1/9

1/1

1/1

4/6

int(f) = 10 f(a)/c(a)

Page 28: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Método dos caminhos de aumento

O método é iterativo. Cada iteração começa comuma �uxo f que respeita as capacidades.

No início da primeira iteração f é o �uxo nulo.

Cada iteração consiste em:

Caso 1: não existe um caminho de aumentoDevolva f e pare

Caso 2: existe uma caminho de aumentoSeja d a capacidade residual de umcaminho de aumento P

Seja f′ o �uxo obtido ao enviarmos dunidades de �uxo ao longo de PComece nova iteração com f′ no papelde f

Page 29: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Relações invariantes

No início de cada iteração temos que:

(i0) f é inteiro;

(i1) f é um �uxo;

(i2) f respeita c.

Page 30: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Capacidade de um corte

Numa rede capacitada, a capacidade de um corte(S,T) é a soma das capacidades dos arcos diretos docorte.Exemplo: corte de capacidade 18

0

2

3

4

5

1

3

7

5

5

2

3

9

1

1

6

Page 31: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Lema da dualidade

Se f é um �uxo que respeita c e (S, T) é um corteentão

intensidade de f ≤ capacidade de (S,T).

Exemplo: int(f) = 10 ≤ 24 = c(S, T).

2

3

4

1

5

0

T

3/34/7

3/5

f(a)/c(a)

3/5

2/2

3/3

1/9

1/1

1/1

4/6

Page 32: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Conseqüência

Se f é um �uxo que respeita c e (S, T) é um cortetais que intensidade de f = capacidade de (S,T).então f é um �uxo de máximo e (S, T) é um corte decapacidade mínima.

2

3

4

1

5

0

T

3/34/7

3/5

f(a)/c(a)

3/5

2/2

3/3

1/9

1/1

1/1

4/6

Page 33: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Conseqüência

Se f é um �uxo que respeita c e (S, T) é um cortetais que intensidade de f = capacidade de (S,T).então f é um �uxo de máximo e (S, T) é um corte decapacidade mínima.

2

3

4

1

5

0

T

3/34/7

3/5

f(a)/c(a)

3/5

2/2

3/3

1/9

1/1

1/1

4/6

Page 34: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Fluxo é máximo?

0

1

2

3

4

5

6

7

1/31/1

0/2

1/1

1/1

2/3

0/1

1/1

3/4

1/1

iten(f ) = 5 f(a)/c(a)

2/2

1/2

2/3

1/1

1/1

Page 35: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Caminho de aumento

0

1

2

3

4

5

6

71/2

2/3

1/31/1

1/1

1/1

0/2

1/1

1/1

2/3

0/1

1/1

3/4

1/1

iten(f ) = 5 f(a)/c(a)

2/2

Page 36: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

E agora? Fluxo é máximo?

0

1

2

3

4

5

6

7

2/30/1

1/2

1/1

1/1

2/3

1/1

1/1

3/4

1/1

iten(f ) = 6 f(a)/c(a)

2/2

2/2

2/3

1/1

1/1

Page 37: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Fluxo é máximo!

0

1

2

3

4

5

6

7

2/30/1

1/2

1/1

1/1

2/3

1/1

1/1

3/4

1/1

iten(f ) = 6 f(a)/c(a)

2/2

2/2

2/3

1/1

1/1

Page 38: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Fluxo é máximo!

0

1

2

3

4

5

6

7

2/30/1

1/2

1/1

1/1

2/3

1/1

1/1

3/4

1/1

iten(f ) = 6 f(a)/c(a)

2/2

2/2

2/3

1/1

1/1

Page 39: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Teorema do �uxo máximo e corte mínimo

O teorema foi demonstrado por Ford e Fulkerson e,independentemente, por Kotzig.

Para quaisquer dois vértices s e t em uma redecapacidade com função-capacidade c tem-se que

max{int(f) : f é �uxo que respeita c}=min{c(S, T) : (S, T) é um corte}.

Page 40: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Teorema do �uxo máximo e corte mínimo

O teorema foi demonstrado por Ford e Fulkerson e,independentemente, por Kotzig.

Em qualquer rede capacitada, a intensidade deum �uxo máximo é igual à capacidade de um

corte mínimo.

Page 41: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

AULA 25

Page 42: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Estrutura de dados para redes de �uxo

S 22.1

Page 43: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Listas de adjacência

Redes serão representadas por listas de

adjacência.Cada arco v-w será representado por um nó na listaencadeada adj[v].Além do campo w, esse nó terá os campos

I cap para armazenar a capacidade do arco v-w eI flow para armazenar o valor do �uxo no arco.I dup para armazenar . . .

Page 44: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Estrutura node

typedef struct node *link;

struct node {Vertex w;

link next;int cap;

int flow;

link dup;

};

Page 45: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Construtor

link

NEW (Vertex w, int cap, int flow, link next) {link x = malloc(sizeof*x);x->w = w;

x->cap = cap;

x->flow = flow;

x->next = next;

return x;

}

Page 46: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Flownet

struct flownet {int V,A;

link *adj;Vertex s,t;

};

typedef struct flownet *Flownet;

Page 47: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Flowinit

Flownet FLOWinit (int V) {Vertex v;

Flownet G = malloc(sizeof *G);G->adj = malloc(V * sizeof(link));G->V = V;

G->A = 0;for (v = 0;v < V;v++) G->adj[v] = NULL;

return G;

}

Page 48: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

FLOWinsert

Insere um arco v-w, de capacidade cap e �uxo nulona rede G.

void

FLOWinsertA (Flownet G,Vertex v,Vertex w,int

cap) {if (v == w || cap < 0) return;G->adj[v] = NEW(w,cap,0,G->adj[v]);G->adj[v]->dup = NULL;

G->A++;}

Page 49: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Redes de �uxo expandidas

É difícil procurar caminhos de aumento numa rede de�uxo porque esses caminhos podem ter arcosinversos.

Para contornar essa di�culdade, vamos introduzir oconceito de rede de �uxo expandida.

Para cada arco v-w, acrescente à rede um arco w-v.

Diremos que os novos arcos são arti�ciais e osantigos são originais

A capacidade arco arti�cial w-v será o negativo dacapacidade do correspondente arco original v-w.

Page 50: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Redes expandidas

O �uxo em cada arco arti�cial será o negativo do�uxo no correspondente arco original.O campo dup nos nós será usado para apontar de umarco original para o correspondente arco arti�cial evice-versa.

Para cada o arco arti�cial teremos

cap ≤ flow ≤ 0

e para cada o arco original teremos

0 ≤ flow ≤ cap

Page 51: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Expand

Função que transforma uma rede de �uxo nacorrespondente rede de �uxo expandida:

void Expand (Flownet G) {

Vertex v,w;

int cap, flow;

link po, pa;

for (v = 0;v < G->V; v++)for(po=G->adj[v];po!=NULL;po=po->next)

po->dup = NULL;

Page 52: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Expand

Função que transforma uma rede de �uxo nacorrespondente rede de �uxo expandida:

void Expand (Flownet G) {Vertex v,w;

int cap, flow;

link po, pa;

for (v = 0;v < G->V; v++)for(po=G->adj[v];po!=NULL;po=po->next)

po->dup = NULL;

Page 53: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

for (v = 0;v < G->V;v++)for(po=G->adj[v];po!=NULL;po=po->next)

if (po->dup== NULL) {w = po->w;

cap = po->cap;

flow = po->flow;

G->adj[w] = pa=NEW(v,-cap,-flow,G->adj[w]);

po->dup= pa;

pa->dup= po;

}}

Page 54: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

flowV

flowV calcula o saldo de �uxo no vértice v de umarede de �uxo expandida G.

int flowV (Flownet G, Vertex v) {

link p;

int x = 0;for (p = G->adj[v]; p != NULL; p = p->next)

x += p->�ow;return x;

}

A intensidade do �uxo é flowV(G, G->s).

Page 55: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

flowV

flowV calcula o saldo de �uxo no vértice v de umarede de �uxo expandida G.

int flowV (Flownet G, Vertex v) {link p;

int x = 0;for (p = G->adj[v]; p != NULL; p = p->next)

x += p->�ow;return x;

}

A intensidade do �uxo é flowV(G, G->s).

Page 56: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Rede expandida e capacidades residuais

Um caminho de s a t na rede de �uxo expandidacorresponde a um caminho de aumento na rede de�uxo original se

I cap ≥ 0 implica em flow < cap eI cap < 0 implica em flow < 0

para todo arco do caminho.A capacidade residual de um arco original da redeexpandida é

cap− flow

e a capacidade residual de um arco arti�cial é

−flow.

Page 57: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Algoritmo de �uxo máximo: versão shortest

augmenting paths

S 22.2

Page 58: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Camada externa da implementação

Um caminho de aumento pode ser representado porum caminho de capacidade residual positiva na redeexpandida.

Para encontrar um tal caminho, podemos usar oalgoritmo de busca em largura como modelo.

Na implementação a seguir, o vetor parnt seráusado de maneira um pouco diferente: ao percorrerum arco v-w da rede expandida, o código fará

parnt[w] = p,

sendo p o endereço do nó na lista adj[v] para o qualp->w vale w.

O "pai" v de w será então parnt[w]->dup->w.

Page 59: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

MaxFlow

Recebe uma rede capacitada (não-expandida) G ecalcula um �uxo máximo.void MaxFlow (Flownet G) {

Vertex s = G->s, t= G->t, x;

int d;link parnt[maxV];Expand(G);while (1) {

d = AugmentingPath(G,parnt);if (d == 0) break;for(x=t;x!=s;x=parnt[x]->dup->w){

parnt[x]->flow += d;

parnt[x]->dup->flow-= d;

}}

}

Page 60: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

MaxFlow

Recebe uma rede capacitada (não-expandida) G ecalcula um �uxo máximo.void MaxFlow (Flownet G) {

Vertex s = G->s, t= G->t, x;

int d;link parnt[maxV];Expand(G);while (1) {

d = AugmentingPath(G,parnt);if (d == 0) break;for(x=t;x!=s;x=parnt[x]->dup->w){

parnt[x]->flow += d;

parnt[x]->dup->flow-= d;

}}

}

Page 61: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Shortest augmenting paths

Para encontrar um caminho de aumento que tenhanúmero mínimo de arcos, basta aplicar o algoritmo debusca em largura à rede de �uxo expandida.

Esta é uma implementação shortest-augmenting-pathda função AugmentingPath.

#de�ne ShrtstAugmPath AugmentingPath

A macro RC recebe um link p e calcula a capacidaderesidual do arco da rede de �uxo expandida que vaido vértice p->dup->w ao vértice p->w.#de�ne RC(p) (p->cap >= 0 ? p->cap - p->flow : -p->flow)

Page 62: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

ShrtstAugmPath

A função ShrtstAugmPath devolve 0 se não hácaminho de aumento.

Caso contrário, devolve a capacidade residual d deum caminho de aumento na rede expandida earmazena o caminho no vetor parnt.

A função supõe que todas as capacidades sãomenores que M.

int ShrtstAugmPath(Flownet G,link parnt[]) {

Vertex s= G->s,t= G->t,v,w;

int lbl[maxV],d;link p;

for (v = 0;v < G->V;v++) lbl[v] = -1;

QUEUEinit(G->V);

Page 63: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

ShrtstAugmPath

A função ShrtstAugmPath devolve 0 se não hácaminho de aumento.

Caso contrário, devolve a capacidade residual d deum caminho de aumento na rede expandida earmazena o caminho no vetor parnt.

A função supõe que todas as capacidades sãomenores que M.

int ShrtstAugmPath(Flownet G,link parnt[]) {Vertex s= G->s,t= G->t,v,w;

int lbl[maxV],d;link p;

for (v = 0;v < G->V;v++) lbl[v] = -1;

QUEUEinit(G->V);

Page 64: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

lbl[s] = 0;QUEUEput(s);while (!QUEUEempty()) {

v = QUEUEget();for(p=G->adj[v];p!=NULL;p=p->next){

w =p->w;if(RC(p)>0 && lbl[w]==-1){

lbl[w] = 0;parnt[w] = p;

QUEUEput(w);}

}}

Page 65: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

if (lbl[t] == -1) return 0;d = M;

for (w = t; w != s; w = p->dup->w){p = parnt[w];if (d > RC(p)) d = RC(p);

}return d;

}

Page 66: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Número de iterações

O número de caminhos de aumento usados pelacombinação de MaxFlow com ShrtstAugmPath

nunca é maior que VA/2, sendo V o número devértices e A o número de arcos originais.

Page 67: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Consumo de tempo

O consumo de tempo de MaxFlow comShrtstAugmPath é O(VA(V+ A)), sendo V onúmero de vértices e A o número de arcos

originais.

Page 68: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Considerações �nais

Page 69: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

MAC0328

MAC0328 Algoritmos em grafos foi:

I uma disciplina introdutória em projeto eanálise de algoritmos sobre grafos

I um laboratório de algoritmos sobre grafos

Page 70: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

MAC0328

MAC0328 combinou técnicas de

I programaçãoI estruturas de dadosI análise de algoritmosI teoria dos grafos

para resolver problemas sobre grafos.

Page 71: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Pré-requisitos

O pré-requisito o�cial de MAC0328 era

I MAC0122 Princípios de Desenvolvimento deAlgoritmos.

No entanto, era recomendável que já tivessemcursado

I MAC0211 Laboratório de programação; eI MAC0323 Estruturas de dados

Costuma ser conveniente cursar MAC0328simultaneamente com

I MAC0338 Análise de algoritmos.

Page 72: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

Principais tópicos foram

I digrafos e grafos

I estruturas de dados para digrafos e grafos

I busca em profundidadeI caminhos e ciclos

I �orestas e árvores

I grafos bipartidos

I digrafos acíclicos

I ordenação topológica

I pontes e ciclos

I grafos conexos e componentes

I articulações e grafos biconexos

I digrafos fortemente conexos

I busca em larguraI caminhos mínimos

I árvores geradoras mínimas

I �uxo em redes

Page 73: @let@token MAC0328 Algoritmos em Grafoscoelho/mac0328-2011/aulas/aula25.pdfCaminho de aumento Um caminho de aumento (= augmenting path ) é um pseudo-caminho do vértice inicial ao

FIM