• Nenhum resultado encontrado

Digrafos acíclicos (DAGs)

N/A
N/A
Protected

Academic year: 2022

Share "Digrafos acíclicos (DAGs)"

Copied!
69
0
0

Texto

(1)

Digrafos acíclicos (DAGs)

S 19.5 e 19.6

(2)

DAGs

Um digrafo é acíclico se não tem ciclos

Digrafos acíclicos também são conhecidos como DAGs (= directed acyclic graphs)

Exemplo: um digrafo acíclico

0

1 2

3 5

4

Algoritmos em Grafos — 1º sem 2012 2 / 69

(3)

DAGs

Um digrafo é acíclico se não tem ciclos

Digrafos acíclicos também são conhecidos como DAGs (= directed acyclic graphs)

Exemplo: um digrafo que não é acíclico

0

1 2

4

(4)

DAGs

Um digrafo é acíclico se não tem ciclos

Digrafos acíclicos também são conhecidos como DAGs (= directed acyclic graphs)

Exemplo: um digrafo que não é acíclico

0

1 2

3 5

4

Algoritmos em Grafos — 1º sem 2012 4 / 69

(5)

Ordenaçao topológica

Uma permutação dos vértices de um digrafo é uma seqüência em que cada vértice aparece uma e uma só vez

Uma ordenação topológica (= topological sorting) de um digrafo é uma permutação

ts[0], ts[1],..., ts[V-1]

dos seus vértices tal que todo arco tem a forma ts[i]-ts[j] com i < j

(6)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 3 2 4 5 1

0

2 1

3 5

4

Algoritmos em Grafos — 1º sem 2012 6 / 69

(7)

DAGs versus ordenação topológica

É evidente que digrafos com ciclos não admitem ordenação topológica.

É menos evidente que todo DAG admite ordenação topológica.

A prova desse fato é um algoritmo que recebe qualquer digrafo e devolve

B um ciclo, ou

uma ordenação topológica do digrafo.

(8)

DAGs versus ordenação topológica

É evidente que digrafos com ciclos não admitem ordenação topológica.

É menos evidente que todo DAG admite ordenação topológica.

A prova desse fato é um algoritmo que recebe qualquer digrafo e devolve

B um ciclo, ou

B uma ordenação topológica do digrafo.

Algoritmos em Grafos — 1º sem 2012 8 / 69

(9)

DAGs versus ordenação topológica

É evidente que digrafos com ciclos não admitem ordenação topológica.

É menos evidente que todo DAG admite ordenação topológica.

A prova desse fato é um algoritmo que recebe qualquer digrafo e devolve

B um ciclo, ou

uma ordenação topológica do digrafo.

(10)

DAGs versus ordenação topológica

É evidente que digrafos com ciclos não admitem ordenação topológica.

É menos evidente que todo DAG admite ordenação topológica.

A prova desse fato é um algoritmo que recebe qualquer digrafo e devolve

B um ciclo, ou

B uma ordenação topológica do digrafo.

Algoritmos em Grafos — 1º sem 2012 10 / 69

(11)

DAGs versus ordenação topológica

É evidente que digrafos com ciclos não admitem ordenação topológica.

É menos evidente que todo DAG admite ordenação topológica.

A prova desse fato é um algoritmo que recebe qualquer digrafo e devolve

B um ciclo, ou

uma ordenação topológica do digrafo.

(12)

Algoritmos de ordenação topológica

S 19.6

Algoritmos em Grafos — 1º sem 2012 12 / 69

(13)

Algoritmo de eliminação de fontes

Armazena em ts[0 . .i-1] uma permutação de um subconjunto do conjunto de vértices de G e devolve o valor de i

Se i = G–>V então ts[0 . .i-1] é uma ordenação topológica de G.

Caso contrário, G não é um DAG

int DAGts1 (Digraph G, Vertex ts[ ]);

(14)

Exemplo

i 0 1 2 3 4 5 ts[i]

0

2 1

3 5

4

Algoritmos em Grafos — 1º sem 2012 14 / 69

(15)

Exemplo

i 0 1 2 3 4 5 ts[i] 0

0

2 1

4

(16)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 3

0

2 1

3 5

4

Algoritmos em Grafos — 1º sem 2012 16 / 69

(17)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 3 2

0

2 1

4

(18)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 3 2 4

0

2 1

3 5

4

Algoritmos em Grafos — 1º sem 2012 18 / 69

(19)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 3 2 4 5

0

2 1

4

(20)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 3 2 4 5 1

0

2 1

3 5

4

Algoritmos em Grafos — 1º sem 2012 20 / 69

(21)

DAGts1

int DAGts1 (Digraph G, Vertex ts[ ]) {

1 int i, in[maxV]; Vertex v; link p;

2 for (v = 0; v < G->V; v++) 3 in[v] = 0;

4 for (v = 0; v < G->V; v++)

5 for (p=G->adj[v];p!=NULL;p=p->next) 6 in[p->w]++;

(22)

DAGts1

7 QUEUEinit(G->V);

8 for(v = 0; v < G->V; v++) 9 if (in[v] == 0)

10 QUEUEput(v);

11 for (i = 0; !QUEUEempty(); i++) { 12 ts[i] = v = QUEUEget();

13 for (p=G->adj[v];p!=NULL;p=p->next) 14 if (--in[p->w] == 0)

15 QUEUEput(p->w);

}

16 QUEUEfree();

17 return i;

Algoritmos em Grafos — 1º sem 2012} 22 / 69

(23)

Implementação de uma fila

/* Item.h */

typedef Vertex Item;

/* QUEUE.h */

void QUEUEinit(int);

int QUEUEempty();

void QUEUEput(Item);

Item QUEUEget();

(24)

QUEUEinit e QUEUEempty

Item *q;

int inicio, fim;

void QUEUEinit(int maxN) {

q = (Item*) malloc(maxN*sizeof(Item));

inicio = 0;

fim = 0;

}

int QUEUEempty() {

return inicio == fim;

}

Algoritmos em Grafos — 1º sem 2012 24 / 69

(25)

QUEUEput , QUEUEget e QUEUEfree

void QUEUEput(Item item){

q[fim++] = item;

}

Item QUEUEget() { return q[inicio++];

}

void QUEUEfree() {

(26)

Consumo de tempo

O consumo de tempo da função DAGts1 para vetor de listas de adjacência é O(V+A).

Algoritmos em Grafos — 1º sem 2012 26 / 69

(27)

Algoritmos de ordenação topológica

S 19.6

(28)

Algoritmo DFS

static int cnt;

static int lbl[maxV];

Recebe um DAG G e armazena em ts[0 . .V-1]

uma ordenação topológica de G

void DAGts2 (Digraph G, Vertex ts[]);

Algoritmos em Grafos — 1º sem 2012 28 / 69

(29)

Exemplo

i 0 1 2 3 4 5 ts[i]

1

4 0

2

(30)

Exemplo

i 0 1 2 3 4 5 ts[i]

1

3 5

4 0

2

Algoritmos em Grafos — 1º sem 2012 30 / 69

(31)

Exemplo

i 0 1 2 3 4 5 ts[i]

1

2 4

0

0

(32)

Exemplo

i 0 1 2 3 4 5 ts[i]

1

3 5

2 4

0 0

Algoritmos em Grafos — 1º sem 2012 32 / 69

(33)

Exemplo

i 0 1 2 3 4 5 ts[i]

1

2 4

0

0 1

(34)

Exemplo

i 0 1 2 3 4 5

ts[i] 1

1

3 5

2 4

0

0 1

Algoritmos em Grafos — 1º sem 2012 34 / 69

(35)

Exemplo

i 0 1 2 3 4 5

ts[i] 1

1

2 4

0

0 1

(36)

Exemplo

i 0 1 2 3 4 5

ts[i] 1

1

3 5

2 4

0

0 1

2

Algoritmos em Grafos — 1º sem 2012 36 / 69

(37)

Exemplo

i 0 1 2 3 4 5

ts[i] 1

1

2 4

0

0 1

2

(38)

Exemplo

i 0 1 2 3 4 5

ts[i] 1

1

3 5

2 4

0

0 1

2

Algoritmos em Grafos — 1º sem 2012 38 / 69

(39)

Exemplo

i 0 1 2 3 4 5

ts[i] 1

1

2 4

0

0 1

2

(40)

Exemplo

i 0 1 2 3 4 5

ts[i] 1

1

3 5

2 4

0

0 1

2

3

Algoritmos em Grafos — 1º sem 2012 40 / 69

(41)

Exemplo

i 0 1 2 3 4 5

ts[i] 1

1

2 4

0

0 1

2

(42)

Exemplo

i 0 1 2 3 4 5

ts[i] 5 1

1

3 5

2 4

0

0 1

2

3

Algoritmos em Grafos — 1º sem 2012 42 / 69

(43)

Exemplo

i 0 1 2 3 4 5

ts[i] 4 5 1

1

2 4

0

0 1

2

(44)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 4 5 1

1

3 5

2 4

0

0 1

2

3

Algoritmos em Grafos — 1º sem 2012 44 / 69

(45)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 4 5 1

1

2 4

0

0 1

2

4

(46)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 4 5 1

1

3 5

2 4

0

0 1

2

3 4

Algoritmos em Grafos — 1º sem 2012 46 / 69

(47)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 4 5 1

1

2 4

0

0 1

2

4

(48)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 4 5 1

1

3 5

2 4

0

0 1

2

3 4

5

Algoritmos em Grafos — 1º sem 2012 48 / 69

(49)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 4 5 1

1

2 4

0

0 1

2

4

(50)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 4 5 1

1

3 5

2 4

0

0 1

2

3 4

5

Algoritmos em Grafos — 1º sem 2012 50 / 69

(51)

Exemplo

i 0 1 2 3 4 5 ts[i] 0 4 5 1

1

2 4

0

0 1

2

4

(52)

Exemplo

i 0 1 2 3 4 5 ts[i] 3 0 4 5 1

1

3 5

2 4

0

0 1

2

3 4

5

Algoritmos em Grafos — 1º sem 2012 52 / 69

(53)

Exemplo

i 0 1 2 3 4 5 ts[i] 3 0 4 5 1

1

2 4

0

0 1

2

4

(54)

Exemplo

i 0 1 2 3 4 5 ts[i] 3 0 4 5 1

1

3 5

2 4

0

0 1

2

3 4

5

Algoritmos em Grafos — 1º sem 2012 54 / 69

(55)

Exemplo

i 0 1 2 3 4 5 ts[i] 2 3 0 4 5 1

1

2 4

0

0 1

2

4

(56)

DAGts2

void DAGts2 (Digraph G, Vertex ts[ ]) { Vertex v;

1 cnt = G->V-1;

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

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

6 TSdfsR(G, v, ts);

}

Algoritmos em Grafos — 1º sem 2012 56 / 69

(57)

DAGts2

void

TSdfsR (Digraph G, Vertex v, Vertex ts[ ]) {

link p;

1 lbl[v] = 0;

2 for (p=G–>adj[v]; p!=NULL; p=p->next) 3 if (lbl[p->w] == -1)

4 TSdfsR(G, p->w, ts);

5 ts[cnt--] = v;

(58)

Consumo de tempo

O consumo de tempo da função DAGts2 para vetor de listas de adjacência é O(V+A).

Algoritmos em Grafos — 1º sem 2012 58 / 69

(59)

Certificado de inexistência

Trecho de código que verifica se um vetor ts[ ] armazena uma uma ordenação topológica dos vértices de um grafo G

[. . . ]

for (v = 0; v < G->V; v++) idx[ts[v]] = v;

for (v= 0; v < G->V; v++)

for (p=G->adj[v];p!=NULL;p=p->next) if (idx[v] > idx[p->w])

return ERRO;

(60)

Certificado de inexistência

Trecho de código que verifica se um vetor ts[ ] armazena uma uma ordenação topológica dos vértices de um grafo G

[. . . ]

for (v = 0; v < G->V; v++) idx[ts[v]] = v;

for (v= 0; v < G->V; v++)

for (p=G->adj[v];p!=NULL;p=p->next) if (idx[v] > idx[p->w])

return ERRO;

[. . . ]

Algoritmos em Grafos — 1º sem 2012 60 / 69

(61)

Adaptação de DIGRAPHcycle

Recebe um digrafo G e devolve 1 se existe um ciclo em G e devolve 0 em caso contrário.

Ademais, se a função devolve 0, então a função devolve no vetor ts[ ] contém uma ordenação topológica dos vértices de G.

Supõe que o digrafo tem no máximo maxV vértices.

int DIGRAPHcycle (Digraph G);

(62)

Adaptação de DIGRAPHcycle

int DIGRAPHcycle (Digraph G, Vertex ts[ ]) { Vertex v;

1 time = 0; cnt = G->V-1;

2 for (v = 0; v < G–>V; v++) 3 d[v] = f[v] = parnt[v] = -1;

4 for (v= 0; v < G–>V;v++) 5 if (d[v] == -1) {

6 parnt[v] = v;

7 if (cycleR(G,v,ts)) return 1;

} 8 return 0;

}

Algoritmos em Grafos — 1º sem 2012 62 / 69

(63)

Adaptação de cycleR

int cycleR (Digraph G,Vertex v,Vertex ts[ ]) {

link p;

1 d[v] = time++;

2 for (p = G–>adj[v]; p != NULL; p= p–>next) 3 if (d[p–>w] == -1) {

4 parnt[p–>w] = v;

5 if(cycleR(G,p–>w,ts)==1) return 1;

}

6 else if (f[w] == -1) return 1;

(64)

Problema

Adaptar essa função para devolver um ciclo, quando houver.

Pode ser devolvida uma lista ligada de vértices, ou um vetor de vértices ou

um apontador para lista ou vetor, mallocado na função.

Algoritmos em Grafos — 1º sem 2012 64 / 69

(65)

Problema

Adaptar essa função para devolver um ciclo, quando houver.

Pode ser devolvida uma lista ligada de vértices, ou um vetor de vértices ou

um apontador para lista ou vetor, mallocado na função.

(66)

Problema

Adaptar essa função para devolver um ciclo, quando houver.

Pode ser devolvida uma lista ligada de vértices, ou um vetor de vértices ou

um apontador para lista ou vetor, mallocado na função.

Algoritmos em Grafos — 1º sem 2012 66 / 69

(67)

Problema

Adaptar essa função para devolver um ciclo, quando houver.

Pode ser devolvida uma lista ligada de vértices, ou um vetor de vértices ou

um apontador para lista ou vetor, mallocado na função.

(68)

Consumo de tempo

O consumo de tempo da função DIGRAPHcycle para vetor de listas de adjacência é O(V+A).

O consumo de tempo da função DIGRAPHcycle para matriz de adjacência é O(V2).

Algoritmos em Grafos — 1º sem 2012 68 / 69

(69)

Conclusão

Para todo digrafo G, vale uma e apenas umas das seguintes afirmações:

G possui um ciclo

G é um DAG e, portanto, admite uma ordenação topológica

Referências

Documentos relacionados

b) DESEMPREGO OCULTO - Pelo trabalho precário: pessoas que realizam de forma irregular algum trabalho remunerado (ou pessoas que realizam trabalho não remunerado

Como vimos, a decisão racional é entendida como um processo que pode ser decomposto em etapas programadas e sequenciais, exigindo que o decisor tenha acesso a

(Ufpe) Na(s) questão(ões) a seguir escreva nos parênteses a letra (V) se a afirmativa for verdadeira ou (F) se for

a) envolvimento do candidato(a) com a Unidade Acadêmica Especial de Ciências Sociais Aplicadas – UFG – Regional Goiás no desenvolvimento da proposta (máximo 20 pontos). b)

[r]

(Administrado pelo Bancoob Distribuidora de Títulos e Valores Mobiliários Ltda. – Bancoob DTVM – CNPJ: 07.397.614/0001-06). Notas explicativas da Administradora às

A função strstr() devolve um ponteiro para a primeira ocorrência da string apontada por str2 na string apontada por str1. Ela devolve um ponteiro nulo se não for encontrada

Devolve o estado de terminação do processo filho que foi atribuído no parâmetro da função exit.. int wait