mc 202 ef - 2s2007 grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · grafos...
TRANSCRIPT
![Page 1: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/1.jpg)
MC 202 EF - 2s2007
Grafos
prof. Fernando Vanini
1
prof. Fernando VaniniIC-UNICAMP
Klais Soluções
![Page 2: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/2.jpg)
Grafos
Definição:• um grafo dirigido G é formado por
– um conjunto finito V de vértices – um conjunto de arestas A ⊆ V × V
• uma aresta liga ou conecta dois vértices.
2
• uma aresta liga ou conecta dois vértices.• um grafo não dirigido é um grafo no qual as
arestas são pares não ordenados.
![Page 3: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/3.jpg)
Grafos
Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo:– redes de distribuição de energia, telecomunicações– malha viária de uma cidade– circuitos elétricos
3
– circuitos elétricos– processos industriais e processos de negócio
![Page 4: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/4.jpg)
Grafos - um exemplo
v2
v3v7
v8
4
v1
v4
v5
v6 v9
![Page 5: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/5.jpg)
Grafos - representação
• Matriz de adjacência:– o grafo é representado por uma matriz quadrada M onde o
elemento M[i,j] é 1 ou 0 indicando se existe ou não uma aresta ligando Vi a Vj.
5
V1 V2 V3 V4 V5
V1 0 1 0 0 1
V2 1 0 1 0 0
V3 0 0 0 1 0
V4 1 1 0 0 0
V5 0 1 0 1 0
![Page 6: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/6.jpg)
Grafos - representação
• Listas de adjacência:– cada vértice Vi do grafo é representado por uma lista que
contém os vértices Vj para os quais existe a aresta (Vi,Vj)
v2 v5
6
v1
v2
v3
v4
v5
v1 v3
v4
v1 v2
v2 v4
![Page 7: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/7.jpg)
Grafos - percursos padrão
Percurso em largura a partir de um vértice Vi:
percurso_em_largura(vértice Vi){
fila F = fila vazia; vértice V;
inserir Vi em F;
enquanto F não for vazia {
retirar V da fila F;
7
retirar V da fila F;
se V ainda não foi visitado {
visita V; marca V como 'visitado';
}
para todo vértice W adjacente a V {
inserir W na fila F;
}
}
}
![Page 8: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/8.jpg)
Grafos - percursos padrão
Percurso em profundidade a partir de um vértice Vi:
percurso_em_ profundidade(vértice Vi){
pilha P = pilha vazia; vértice V;
inserir Vi em P;
enquanto P não for vazia {
desempilhar V;
8
desempilhar V;
se V ainda não foi visitado {
visita V; marca V como 'visitado';
}
para todo vértice W adjacente a V { empilhar W ; }
}
}
![Page 9: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/9.jpg)
Grafos - representação em C
Arestas:
/* representação de uma aresta */
typedef struct edge* apEdge;
typedef struct edge {
int c; /* 'peso' ou 'custo' associado à aresta */
9
int c; /* 'peso' ou 'custo' associado à aresta */
int v; /* índice do vértice 'destino' */
apEdge next; /* próxima aresta da lista */
} edge;
![Page 10: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/10.jpg)
Grafos - representação em C
Vértices:typedef struct vert* apVert;
typedef struct edge* apEdge;
/* descrição de um vértice */
typedef struct vert {
int d; /* 'distância' do vértice à 'origem' */
10
int d; /* 'distância' do vértice à 'origem' */
int r; /* próximo vértice no caminho até a origem */
int m; /* vértice marcado ? */
apEdge list; /* lista de arestas */
} vert;
Grafo: struct vert graph[n];
![Page 11: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/11.jpg)
Grafos - representação em C
Percurso em profundidade (versão recursiva):
void depthFirst(apVert g, int v){
apEdge e;
if(!g[v].m){
printf(" %d,",v);
11
printf(" %d,",v);
g[v].m = true;
e = g[v].list;
while(e != NULL){
depthFirst(g,e->v);
e = e->next;
}
}
}
![Page 12: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/12.jpg)
Grafos - percurso em largura
void breathFirst(apVert g, int v){
int w; apEdge e;
qInit();
qInsert(v); g[v].m = true;
while((w=qRemove())!= NULLNODE){
printf("w:%d ",w);
e = g[w].list;
12
e = g[w].list;
while(e != NULL){
if(!g[e->v].m) {
g[e->v].m = true;
qInsert(e->v);
}
e = e->next;
}
}
}
![Page 13: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/13.jpg)
Caminho num grafo
• Um caminho num grafo G = (V,E) é uma seqüência de arestas a1, a2 ... ak,, pertencentes a E tais que
• a1 = (v1, v2)• a2 = (v2, v3)• ...
13
• ak-1 = (vk-1,vk)• ak = (vk, vk+1)
v1
v2
v3
v4a1
a2a3
![Page 14: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/14.jpg)
Caminho mínimo
• Dado um grafo G = (V,E), um caminho C, de um vértice v a um vértice w, é mínimo em G se ele for o caminho de v a w em que a soma das 'distâncias' em cada uma das suas arestas for mínima.
14
![Page 15: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/15.jpg)
Exemplos
• Nos exemplos a seguir, as arestas em vermelho fazem parte da árvore dos caminhos mínimos a partir da origem (v0).
15
![Page 16: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/16.jpg)
Algoritmo de Dijkstra
• O algoritmo de Dijkstra, usa uma abordagem parecida com o percurso em largura, utilizando a ‘proximidade’ de cada nó à origem como critério para inclui-lo na seqüência de visitas.
16
![Page 17: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/17.jpg)
Algoritmo de Dijkstra
caminhos_mínimos (grafo g, vértice v) {
iniciar o grafo; iniciar a fila de prioridades pQ;
enquanto pQ não vazia {
remover w de pQ; /* dist(v,w) é mínima */
para todo x adjacente a w {
nd = dist(v,w)+dist(w,x);
17
nd = dist(v,w)+dist(w,x);
se (nd < dist(v,x) {
dist(v,x) = nd;
rearranjar pQ; /* dist(v,x) foi alterada */
}
}
}
}
![Page 18: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/18.jpg)
Algoritmo de Dijkstra
iniciar o grafo( ){
para todo vértice w {
se E contém a aresta (v,w)
então dist(v,w) = distância ‘direta’ de v a w;
senão dist(v,w) = ∞ ;
18
senão dist(v,w) = ∞ ;
}
iniciar fila de prioridades pQ( ) {
para todo vértice w
inserir w em pQ de acordo com dist(v,w);
}
![Page 19: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/19.jpg)
Algoritmo de Dijkstra
• Tempo de execução– Cada aresta do grafo é visitada uma vez e a cada
visita pode ocorrer um rearranjo da fila de prioridades.
– Se a fila de prioridades for implementada como um heap, cada rearranjo vai levar um tempo proporcional
19
heap, cada rearranjo vai levar um tempo proporcional a log
2|V|.
– O tempo de execução será portanto proporcional a |E|log
2|V| ou |V|2log
2|V|.
![Page 20: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/20.jpg)
Caminho mínimo p/ todos os pares de vértices
Algoritmo de Floyd-Warshall• Grafo representado como uma matriz M onde
M[i][j] representa o ‘custo’ da aresta (i,j):– Se (i,j) Є E , M[i][j] = custo(i,j) senão M[i][j] = ∞.
for(k = 0; k < N; k++)
20
for(k = 0; k < N; k++)
for(i = 0; i < N; i++)
for(j = 0; j< N; j++){
int s = M[i][k] + M[k][j];
if( s < M[i][j])
M[i][j] = s;
}
• O tempo de execução é proporcional a N 3 .
![Page 21: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/21.jpg)
Caminho mínimo p/ todos os pares de vértices
Identificando os caminhos• O algoritmo apresentado só determina o custo do menor caminho
para cada par de vértices (i,j).• Para determinar os caminhos, pode-se usar uma matriz R onde
cada elemento (i,j) define o próximo trecho do ‘caminho reverso’ de i a j (inicialmente, R[i][j] = NULL p/ todo par (i,j) ).
21
for(k = 0; k < N; k++)
for(i = 0; i < N; i++)
for(j = 0; j < N; j++){
int s = M[i][k] + M[k][j];
if( s < M[i][j])
M[i][j] = s; R[i][j] = k;
}
![Page 22: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/22.jpg)
Caminho mínimo p/ todos os pares de vértices
Identificando os caminhos• Tendo executado o algoritmo, para se obter o caminho mínimo de
um vértice i até um vértice j temos que refazer cada trecho do caminho a partir de R[i][j], o que é feito na função abaixo.
void printPath(int i, int j){
if(R[i][j] == NULL) printf(“aresta %d - %d\n”,i,j);
22
if(R[i][j] == NULL) printf(“aresta %d - %d\n”,i,j);
else {
printPath(i,R[i][j]);
printPath(R[i][j],j);
}
}
![Page 23: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/23.jpg)
Árvore geradora de um grafo
• Dado G = (V,E) onde V é o conjunto de vértices e E é o conjunto de arestas, o grafo G' = (V,A), onde A ⊆ E é uma árvore geradora de G se– G' não contém ciclos e– Se em G existir um caminho de v para w então em G'
também existe um caminho de v para w ou de w para
23
também existe um caminho de v para w ou de w para v.
![Page 24: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/24.jpg)
Construção da árvore geradora
Entrada: grafo G = (V,E)
início
A = conjunto vazio de arestas;
para toda aresta a de E faça
se a não forma ciclo com as arestas em A
24
se a não forma ciclo com as arestas em A
então insira a em A;
fim;
![Page 25: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/25.jpg)
"a forma ciclo com as arestas em A" ?
• ao longo do processo de construção da árvore, são montados pedaços da mesma que vão se juntando à medida em que as arestas são inseridas .
• uma aresta a = (v1, v2) vai formar ciclo com as arestas em A se v1 e v2 estiverem no mesmo pedaço da árvore.
• uma forma eficiente de verificar se uma aresta a forma ciclo com as arestas em A é
25
ciclo com as arestas em A é– considerar cada pedaço da árvore como uma classe de
equivalência– a = (v1, v2) forma ciclo com as arestas em A se v1 e v2
estiverem na mesma classe de equivalência.– quando uma aresta a = (v1, v2) for inserida na árvore, as
classes de equivalência de v1 e v2 passam a ser uma única classe (os pedaços se juntam).
![Page 26: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/26.jpg)
Classes de equivalência
• Representação– cada vértice mantém um apontador para o
'representante' da sua classe. Para o representante, esse apontador é igual a NULL.
– no início do algoritmo, quando a árvore é vazia, cada vértice é o representante da sua própria classe.
26
vértice é o representante da sua própria classe.
/* descrição de um vértice */
typedef struct vert {
int d; /* 'distância' do vértice à 'origem' */
int r; /* próximo vértice no caminho até a origem */
int m; /* vértice marcado ? */
apVert s; /* aponta para o 'representante' deste vértice */
apEdge list; /* lista de arestas iniciando neste vértice */
} vert;
![Page 27: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/27.jpg)
Classes de equivalência
Operações- determinar a classe de equivalência de um vértice v
/* devolve a 'raiz' da classe de equiv. de um vértice */
apVert super(apVert v){
if(v->s == NULL) return v;
return (v->s = super(v->s));
}
27
A cada busca pela classe de equivalência, os vérticesintermediários também são atualizados, de forma que aspróximas buscas serão mais rápidas.
}
![Page 28: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/28.jpg)
Classes de equivalência
Operações- juntar as classes de equivalência dos vértices v e w
/* coloca v e w na mesma classe de equivalência */
void makeEquiv(apVert v, apVert w){
apVert sv = super(v);
28
apVert sw = super(w);
if(sv != sw) sv->s = sw;
}
![Page 29: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/29.jpg)
Construção da árvore geradora
As arestas da árvore podem ser mantidas numa lista onde cada nó é do tipo:
typedef struct spTreeEdge* apSpTreeEdge;
typedef struct spTreeEdge {
int v1; /* primeiro vértice */
29
int v1; /* primeiro vértice */
int v2; /* segundo vértice */
apSpTreeEdge next; /* próximo da lista */
} spTreeEdge;
![Page 30: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/30.jpg)
Construção da árvore geradora
/* árvore geradora de um grafo g com n vértices */
apSpTreeEdge makeSpanningTree(apVert g, int n){
int i;
apSpTreeEdge spTree = NULL;
for(i = 0; i < n; i++){
apEdge e = g[i].list;
while(e != NULL){
if(super(&g[i]) != super(&g[e->v])){
30
if(super(&g[i]) != super(&g[e->v])){
makeEquiv(&g[i],&g[e->v]);
spTree = newSpEdge(i,e->v,spTree);
}
e = e->next;
}
}
return spTree;
}
![Page 31: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/31.jpg)
MC 202 EF - 2s2007
Grafos
prof. Fernando Vanini
1
prof. Fernando VaniniIC-UNICAMP
Klais Soluções
![Page 32: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/32.jpg)
Grafos
Definição:• um grafo dirigido G é formado por
– um conjunto finito V de vértices – um conjunto de arestas A ⊆ V × V
• uma aresta liga ou conecta dois vértices.
2
• uma aresta liga ou conecta dois vértices.• um grafo não dirigido é um grafo no qual as
arestas são pares não ordenados.
![Page 33: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/33.jpg)
Grafos
Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo:– redes de distribuição de energia, telecomunicações– malha viária de uma cidade– circuitos elétricos
3
– circuitos elétricos– processos industriais e processos de negócio
![Page 34: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/34.jpg)
Grafos - um exemplo
v2
v3v7
v8
4
v1
v4
v5
v6 v9
![Page 35: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/35.jpg)
Grafos - representação
• Matriz de adjacência:– o grafo é representado por uma matriz quadrada M onde o
elemento M[i,j] é 1 ou 0 indicando se existe ou não uma aresta ligando Vi a Vj.
5
V1 V2 V3 V4 V5
V1 0 1 0 0 1
V2 1 0 1 0 0
V3 0 0 0 1 0
V4 1 1 0 0 0
V5 0 1 0 1 0
![Page 36: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/36.jpg)
Grafos - representação
• Listas de adjacência:– cada vértice Vi do grafo é representado por uma lista que
contém os vértices Vj para os quais existe a aresta (Vi,Vj)
v2 v5
6
v1
v2
v3
v4
v5
v1 v3
v4
v1 v2
v2 v4
![Page 37: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/37.jpg)
Grafos - percursos padrão
Percurso em largura a partir de um vértice Vi:
percurso_em_largura(vértice Vi){
fila F = fila vazia; vértice V;
inserir Vi em F;
enquanto F não for vazia {
retirar V da fila F;
7
retirar V da fila F;
se V ainda não foi visitado {
visita V; marca V como 'visitado';
}
para todo vértice W adjacente a V {
inserir W na fila F;
}
}
}
![Page 38: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/38.jpg)
Grafos - percursos padrão
Percurso em profundidade a partir de um vértice Vi:
percurso_em_ profundidade(vértice Vi){
pilha P = pilha vazia; vértice V;
inserir Vi em P;
enquanto P não for vazia {
desempilhar V;
8
desempilhar V;
se V ainda não foi visitado {
visita V; marca V como 'visitado';
}
para todo vértice W adjacente a V { empilhar W ; }
}
}
![Page 39: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/39.jpg)
Grafos - representação em C
Arestas:
/* representação de uma aresta */
typedef struct edge* apEdge;
typedef struct edge {
int c; /* 'peso' ou 'custo' associado à aresta */
9
int c; /* 'peso' ou 'custo' associado à aresta */
int v; /* índice do vértice 'destino' */
apEdge next; /* próxima aresta da lista */
} edge;
![Page 40: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/40.jpg)
Grafos - representação em C
Vértices:typedef struct vert* apVert;
typedef struct edge* apEdge;
/* descrição de um vértice */
typedef struct vert {
int d; /* 'distância' do vértice à 'origem' */
10
int d; /* 'distância' do vértice à 'origem' */
int r; /* próximo vértice no caminho até a origem */
int m; /* vértice marcado ? */
apEdge list; /* lista de arestas */
} vert;
Grafo: struct vert graph[n];
![Page 41: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/41.jpg)
Grafos - representação em C
Percurso em profundidade (versão recursiva):
void depthFirst(apVert g, int v){
apEdge e;
if(!g[v].m){
printf(" %d,",v);
11
printf(" %d,",v);
g[v].m = true;
e = g[v].list;
while(e != NULL){
depthFirst(g,e->v);
e = e->next;
}
}
}
![Page 42: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/42.jpg)
Grafos - percurso em largura
void breathFirst(apVert g, int v){
int w; apEdge e;
qInit();
qInsert(v); g[v].m = true;
while((w=qRemove())!= NULLNODE){
printf("w:%d ",w);
e = g[w].list;
12
e = g[w].list;
while(e != NULL){
if(!g[e->v].m) {
g[e->v].m = true;
qInsert(e->v);
}
e = e->next;
}
}
}
![Page 43: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/43.jpg)
Caminho num grafo
• Um caminho num grafo G = (V,E) é uma seqüência de arestas a1, a2 ... ak,, pertencentes a E tais que
• a1 = (v1, v2)• a2 = (v2, v3)• ...
13
• ak-1 = (vk-1,vk)• ak = (vk, vk+1)
v1
v2
v3
v4a1
a2a3
![Page 44: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/44.jpg)
Caminho mínimo
• Dado um grafo G = (V,E), um caminho C, de um vértice v a um vértice w, é mínimo em G se ele for o caminho de v a w em que a soma das 'distâncias' em cada uma das suas arestas for mínima.
14
![Page 45: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/45.jpg)
Exemplos
• Nos exemplos a seguir, as arestas em vermelho fazem parte da árvore dos caminhos mínimos a partir da origem (v0).
15
![Page 46: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/46.jpg)
Algoritmo de Dijkstra
• O algoritmo de Dijkstra, usa uma abordagem parecida com o percurso em largura, utilizando a ‘proximidade’ de cada nó à origem como critério para inclui-lo na seqüência de visitas.
16
![Page 47: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/47.jpg)
Algoritmo de Dijkstra
caminhos_mínimos (grafo g, vértice v) {
iniciar o grafo; iniciar a fila de prioridades pQ;
enquanto pQ não vazia {
remover w de pQ; /* dist(v,w) é mínima */
para todo x adjacente a w {
nd = dist(v,w)+dist(w,x);
17
nd = dist(v,w)+dist(w,x);
se (nd < dist(v,x) {
dist(v,x) = nd;
rearranjar pQ; /* dist(v,x) foi alterada */
}
}
}
}
![Page 48: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/48.jpg)
Algoritmo de Dijkstra
iniciar o grafo( ){
para todo vértice w {
se E contém a aresta (v,w)
então dist(v,w) = distância ‘direta’ de v a w;
senão dist(v,w) = ∞ ;
18
senão dist(v,w) = ∞ ;
}
iniciar fila de prioridades pQ( ) {
para todo vértice w
inserir w em pQ de acordo com dist(v,w);
}
![Page 49: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/49.jpg)
Algoritmo de Dijkstra
• Tempo de execução– Cada aresta do grafo é visitada uma vez e a cada
visita pode ocorrer um rearranjo da fila de prioridades.
– Se a fila de prioridades for implementada como um heap, cada rearranjo vai levar um tempo proporcional
19
heap, cada rearranjo vai levar um tempo proporcional a log
2|V|.
– O tempo de execução será portanto proporcional a |E|log
2|V| ou |V|2log
2|V|.
![Page 50: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/50.jpg)
Caminho mínimo p/ todos os pares de vértices
Algoritmo de Floyd-Warshall• Grafo representado como uma matriz M onde
M[i][j] representa o ‘custo’ da aresta (i,j):– Se (i,j) Є E , M[i][j] = custo(i,j) senão M[i][j] = ∞.
for(k = 0; k < N; k++)
20
for(k = 0; k < N; k++)
for(i = 0; i < N; i++)
for(j = 0; j< N; j++){
int s = M[i][k] + M[k][j];
if( s < M[i][j])
M[i][j] = s;
}
• O tempo de execução é proporcional a N 3 .
![Page 51: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/51.jpg)
Caminho mínimo p/ todos os pares de vértices
Identificando os caminhos• O algoritmo apresentado só determina o custo do menor caminho
para cada par de vértices (i,j).• Para determinar os caminhos, pode-se usar uma matriz R onde
cada elemento (i,j) define o próximo trecho do ‘caminho reverso’ de i a j (inicialmente, R[i][j] = NULL p/ todo par (i,j) ).
21
for(k = 0; k < N; k++)
for(i = 0; i < N; i++)
for(j = 0; j < N; j++){
int s = M[i][k] + M[k][j];
if( s < M[i][j])
M[i][j] = s; R[i][j] = k;
}
![Page 52: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/52.jpg)
Caminho mínimo p/ todos os pares de vértices
Identificando os caminhos• Tendo executado o algoritmo, para se obter o caminho mínimo de
um vértice i até um vértice j temos que refazer cada trecho do caminho a partir de R[i][j], o que é feito na função abaixo.
void printPath(int i, int j){
if(R[i][j] == NULL) printf(“aresta %d - %d\n”,i,j);
22
if(R[i][j] == NULL) printf(“aresta %d - %d\n”,i,j);
else {
printPath(i,R[i][j]);
printPath(R[i][j],j);
}
}
![Page 53: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/53.jpg)
Árvore geradora de um grafo
• Dado G = (V,E) onde V é o conjunto de vértices e E é o conjunto de arestas, o grafo G' = (V,A), onde A ⊆ E é uma árvore geradora de G se– G' não contém ciclos e– Se em G existir um caminho de v para w então em G'
também existe um caminho de v para w ou de w para
23
também existe um caminho de v para w ou de w para v.
![Page 54: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/54.jpg)
Construção da árvore geradora
Entrada: grafo G = (V,E)
início
A = conjunto vazio de arestas;
para toda aresta a de E faça
se a não forma ciclo com as arestas em A
24
se a não forma ciclo com as arestas em A
então insira a em A;
fim;
![Page 55: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/55.jpg)
"a forma ciclo com as arestas em A" ?
• ao longo do processo de construção da árvore, são montados pedaços da mesma que vão se juntando à medida em que as arestas são inseridas .
• uma aresta a = (v1, v2) vai formar ciclo com as arestas em A se v1 e v2 estiverem no mesmo pedaço da árvore.
• uma forma eficiente de verificar se uma aresta a forma ciclo com as arestas em A é
25
ciclo com as arestas em A é– considerar cada pedaço da árvore como uma classe de
equivalência– a = (v1, v2) forma ciclo com as arestas em A se v1 e v2
estiverem na mesma classe de equivalência.– quando uma aresta a = (v1, v2) for inserida na árvore, as
classes de equivalência de v1 e v2 passam a ser uma única classe (os pedaços se juntam).
![Page 56: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/56.jpg)
Classes de equivalência
• Representação– cada vértice mantém um apontador para o
'representante' da sua classe. Para o representante, esse apontador é igual a NULL.
– no início do algoritmo, quando a árvore é vazia, cada vértice é o representante da sua própria classe.
26
vértice é o representante da sua própria classe.
/* descrição de um vértice */
typedef struct vert {
int d; /* 'distância' do vértice à 'origem' */
int r; /* próximo vértice no caminho até a origem */
int m; /* vértice marcado ? */
apVert s; /* aponta para o 'representante' deste vértice */
apEdge list; /* lista de arestas iniciando neste vértice */
} vert;
![Page 57: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/57.jpg)
Classes de equivalência
Operações- determinar a classe de equivalência de um vértice v
/* devolve a 'raiz' da classe de equiv. de um vértice */
apVert super(apVert v){
if(v->s == NULL) return v;
return (v->s = super(v->s));
}
27
A cada busca pela classe de equivalência, os vérticesintermediários também são atualizados, de forma que aspróximas buscas serão mais rápidas.
}
![Page 58: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/58.jpg)
Classes de equivalência
Operações- juntar as classes de equivalência dos vértices v e w
/* coloca v e w na mesma classe de equivalência */
void makeEquiv(apVert v, apVert w){
apVert sv = super(v);
28
apVert sw = super(w);
if(sv != sw) sv->s = sw;
}
![Page 59: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/59.jpg)
Construção da árvore geradora
As arestas da árvore podem ser mantidas numa lista onde cada nó é do tipo:
typedef struct spTreeEdge* apSpTreeEdge;
typedef struct spTreeEdge {
int v1; /* primeiro vértice */
29
int v1; /* primeiro vértice */
int v2; /* segundo vértice */
apSpTreeEdge next; /* próximo da lista */
} spTreeEdge;
![Page 60: MC 202 EF - 2s2007 Grafos - ic.unicamp.brvanini/mc202/apresentacoes/grafos.pdf · Grafos Aplicações: grafos são muito utilizados para modelar sistemas reais como por exemplo: –](https://reader033.vdocuments.site/reader033/viewer/2022052320/5c23cad509d3f224508be2c3/html5/thumbnails/60.jpg)
Construção da árvore geradora
/* árvore geradora de um grafo g com n vértices */
apSpTreeEdge makeSpanningTree(apVert g, int n){
int i;
apSpTreeEdge spTree = NULL;
for(i = 0; i < n; i++){
apEdge e = g[i].list;
while(e != NULL){
if(super(&g[i]) != super(&g[e->v])){
30
if(super(&g[i]) != super(&g[e->v])){
makeEquiv(&g[i],&g[e->v]);
spTree = newSpEdge(i,e->v,spTree);
}
e = e->next;
}
}
return spTree;
}