Grafos
Definio: um grafo dirigido G formado por
um conjunto finito V de vrtices um conjunto de arestas A V V
uma aresta liga ou conecta dois vrtices. um grafo no dirigido um grafo no qual as arestas so pares no ordenados.
Grafos
Aplicaes: grafos so muito utilizados para modelar sistemas reais como por exemplo:
redes de distribuio de energia, telecomunicaes malha viria de uma cidade circuitos eltricos processos industriais e processos de negcio
Grafos - um exemplo
v7 v3 v2
v8 v1 v4 v6 v9 v5
Grafos - representao
Matriz de adjacncia:
o grafo representado por uma matriz quadrada M onde o elemento M[i,j] 1 ou 0 indicando se existe ou no uma aresta ligando Vi a Vj.
V1 V1 V2 V3 V4 V5 0 1 0 1 0
V2 1 0 0 1 1
V3 0 1 0 0 0
V4 0 0 1 0 1
V5 1 0 0 0 0
Grafos - representao
Listas de adjacncia:
cada vrtice Vi do grafo representado por uma lista que contm os vrtices Vj para os quais existe a aresta (Vi,Vj)
v2 v1 v2 v3 v4 v5 v1 v2 v4 v1
v5 v3
v2 v4
Grafos - representao em C
Arestas:
/* representao de uma aresta */ typedef struct edge* apEdge; typedef struct edge { int c; /* 'peso' ou 'custo' associado aresta */ int v; /* ndice do vrtice 'destino' */ apEdge next; /* prxima aresta da lista */ } edge;
Grafos - representao em C
Vrtices:
typedef struct vert* apVert; typedef struct edge* apEdge; /* descrio de um vrtice */ typedef struct vert { int d; /* 'distncia' do vrtice 'origem' int r; /* prximo vrtice no caminho at a origem int m; /* vrtice marcado ? apEdge list; /* lista de arestas } vert;
*/ */ */ */
Grafo:
struct vert graph[n];
10
Grafos - representao em C
Percurso em profundidade (verso recursiva):
void depthFirst(apVert g, int v){ apEdge e; if(!g[v].m){ printf(" %d,",v); g[v].m = true; e = g[v].list; while(e != NULL){ depthFirst(g,e->v); e = e->next; } } }
11
13
Caminho mnimo
Dado um grafo G = (V,E), um caminho C, de um vrtice v a um vrtice w, mnimo em G se ele for o caminho de v a w em que a soma das 'distncias' em cada uma das suas arestas for mnima.
14
Exemplos
Nos exemplos a seguir, as arestas em vermelho fazem parte da rvore dos caminhos mnimos a partir da origem (v0).
15
Algoritmo de Dijkstra
O algoritmo de Dijkstra, usa uma abordagem parecida com o percurso em largura, utilizando a proximidade de cada n origem como critrio para inclui-lo na seqncia de visitas.
16
Algoritmo de Dijkstra
caminhos_mnimos (grafo g, vrtice v) { iniciar o grafo; iniciar a fila de prioridades pQ; enquanto pQ no vazia { remover w de pQ; /* dist(v,w) mnima */ para todo x adjacente a w { nd = dist(v,w)+dist(w,x); se (nd < dist(v,x) { dist(v,x) = nd; rearranjar pQ; /* dist(v,x) foi alterada */ } } } }
17
Algoritmo de Dijkstra
iniciar o grafo( ){ para todo vrtice w { se E contm a aresta (v,w) ento dist(v,w) = distncia direta de v a w; seno dist(v,w) = ; } iniciar fila de prioridades pQ( ) { para todo vrtice w inserir w em pQ de acordo com dist(v,w); }
18
Algoritmo de Dijkstra
Tempo de execuo
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 a log2 |V|. O tempo de execuo ser portanto proporcional a |E|log2|V| ou |V|2log2|V|.
19
Caminho mnimo p/ todos os pares de vrtices 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) seno M[i][j] = .
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; }
21
22
23
incio A = conjunto vazio de arestas; para toda aresta a de E faa se a no forma ciclo com as arestas em A ento insira a em A; fim;
24
Classes de equivalncia
Representao
cada vrtice mantm um apontador para o 'representante' da sua classe. Para o representante, esse apontador igual a NULL. no incio do algoritmo, quando a rvore vazia, cada vrtice o representante da sua prpria classe.
/* descrio de um vrtice */ typedef struct vert { int d; /* 'distncia' do vrtice 'origem' int r; /* prximo vrtice no caminho at a origem int m; /* vrtice marcado ? apVert s; /* aponta para o 'representante' deste vrtice apEdge list; /* lista de arestas iniciando neste vrtice } vert;
*/ */ */ */ */
26
Classes de equivalncia
Operaes
- determinar a classe de equivalncia de um vrtice v
/* devolve a 'raiz' da classe de equiv. de um vrtice */ apVert super(apVert v){ if(v->s == NULL) return v; return (v->s = super(v->s)); }
A cada busca pela classe de equivalncia, os vrtices intermedirios tambm so atualizados, de forma que as prximas buscas sero mais rpidas.
27
Classes de equivalncia
Operaes
- juntar as classes de equivalncia dos vrtices v e w
/* coloca v e w na mesma classe de equivalncia */ void makeEquiv(apVert v, apVert w){ apVert sv = super(v); apVert sw = super(w); if(sv != sw) sv->s = sw; }
28
*/ */ */
29
Grafos
Definio: um grafo dirigido G formado por
um conjunto finito V de vrtices um conjunto de arestas A V V
uma aresta liga ou conecta dois vrtices. um grafo no dirigido um grafo no qual as arestas so pares no ordenados.
Grafos
Aplicaes: grafos so muito utilizados para modelar sistemas reais como por exemplo:
redes de distribuio de energia, telecomunicaes malha viria de uma cidade circuitos eltricos processos industriais e processos de negcio
Grafos - um exemplo
v7 v3 v2
v8 v1 v4 v6 v9 v5
Grafos - representao
Matriz de adjacncia:
o grafo representado por uma matriz quadrada M onde o elemento M[i,j] 1 ou 0 indicando se existe ou no uma aresta ligando Vi a Vj.
V1 V1 V2 V3 V4 V5 0 1 0 1 0
V2 1 0 0 1 1
V3 0 1 0 0 0
V4 0 0 1 0 1
V5 1 0 0 0 0
Grafos - representao
Listas de adjacncia:
cada vrtice Vi do grafo representado por uma lista que contm os vrtices Vj para os quais existe a aresta (Vi,Vj)
v2 v1 v2 v3 v4 v5 v1 v2 v4 v1
v5 v3
v2 v4
Grafos - representao em C
Arestas:
/* representao de uma aresta */ typedef struct edge* apEdge; typedef struct edge { int c; /* 'peso' ou 'custo' associado aresta */ int v; /* ndice do vrtice 'destino' */ apEdge next; /* prxima aresta da lista */ } edge;
Grafos - representao em C
Vrtices:
typedef struct vert* apVert; typedef struct edge* apEdge; /* descrio de um vrtice */ typedef struct vert { int d; /* 'distncia' do vrtice 'origem' int r; /* prximo vrtice no caminho at a origem int m; /* vrtice marcado ? apEdge list; /* lista de arestas } vert;
*/ */ */ */
Grafo:
struct vert graph[n];
10
Grafos - representao em C
Percurso em profundidade (verso recursiva):
void depthFirst(apVert g, int v){ apEdge e; if(!g[v].m){ printf(" %d,",v); g[v].m = true; e = g[v].list; while(e != NULL){ depthFirst(g,e->v); e = e->next; } } }
11
13
Caminho mnimo
Dado um grafo G = (V,E), um caminho C, de um vrtice v a um vrtice w, mnimo em G se ele for o caminho de v a w em que a soma das 'distncias' em cada uma das suas arestas for mnima.
14
Exemplos
Nos exemplos a seguir, as arestas em vermelho fazem parte da rvore dos caminhos mnimos a partir da origem (v0).
15
Algoritmo de Dijkstra
O algoritmo de Dijkstra, usa uma abordagem parecida com o percurso em largura, utilizando a proximidade de cada n origem como critrio para inclui-lo na seqncia de visitas.
16
Algoritmo de Dijkstra
caminhos_mnimos (grafo g, vrtice v) { iniciar o grafo; iniciar a fila de prioridades pQ; enquanto pQ no vazia { remover w de pQ; /* dist(v,w) mnima */ para todo x adjacente a w { nd = dist(v,w)+dist(w,x); se (nd < dist(v,x) { dist(v,x) = nd; rearranjar pQ; /* dist(v,x) foi alterada */ } } } }
17
Algoritmo de Dijkstra
iniciar o grafo( ){ para todo vrtice w { se E contm a aresta (v,w) ento dist(v,w) = distncia direta de v a w; seno dist(v,w) = ; } iniciar fila de prioridades pQ( ) { para todo vrtice w inserir w em pQ de acordo com dist(v,w); }
18
Algoritmo de Dijkstra
Tempo de execuo
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 a log2 |V|. O tempo de execuo ser portanto proporcional a |E|log2|V| ou |V|2log2|V|.
19
Caminho mnimo p/ todos os pares de vrtices 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) seno M[i][j] = .
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; }
21
22
23
incio A = conjunto vazio de arestas; para toda aresta a de E faa se a no forma ciclo com as arestas em A ento insira a em A; fim;
24
Classes de equivalncia
Representao
cada vrtice mantm um apontador para o 'representante' da sua classe. Para o representante, esse apontador igual a NULL. no incio do algoritmo, quando a rvore vazia, cada vrtice o representante da sua prpria classe.
/* descrio de um vrtice */ typedef struct vert { int d; /* 'distncia' do vrtice 'origem' int r; /* prximo vrtice no caminho at a origem int m; /* vrtice marcado ? apVert s; /* aponta para o 'representante' deste vrtice apEdge list; /* lista de arestas iniciando neste vrtice } vert;
*/ */ */ */ */
26
Classes de equivalncia
Operaes
- determinar a classe de equivalncia de um vrtice v
/* devolve a 'raiz' da classe de equiv. de um vrtice */ apVert super(apVert v){ if(v->s == NULL) return v; return (v->s = super(v->s)); }
A cada busca pela classe de equivalncia, os vrtices intermedirios tambm so atualizados, de forma que as prximas buscas sero mais rpidas.
27
Classes de equivalncia
Operaes
- juntar as classes de equivalncia dos vrtices v e w
/* coloca v e w na mesma classe de equivalncia */ void makeEquiv(apVert v, apVert w){ apVert sv = super(v); apVert sw = super(w); if(sv != sw) sv->s = sw; }
28
*/ */ */
29