Escolar Documentos
Profissional Documentos
Cultura Documentos
Grafos
Grafos
Grafos
1. 2. 3. 4. 5. 6. 7. 8. 9.
Definio Exemplo Grafos orientados Grafos no orientados Grafos ponderados Outras definies Representao de grafos: matrizes e listas Operaes elementares: busca em profundidade e largura Algoritmo do menor caminho - Dijkstra
Definio de grafo
Um grafo consiste de 2 conjuntos:
V (finito e no vazio): conjunto de vrtices (ns) E: conjunto de pares de vrtices (arestas)
Exemplo de grafo
G = (V,E) V = {1,2,3} E = {(1,2),(2,3)}
2 3
Grafos no orientados
Uma aresta representada por pares de vrtices no ordenados. (u,v) e (v,u) representam a mesma aresta Exemplo: V = {1,2,3} E = {(1,2),(2,3)}
1 2 3
Representao de Grafos
Matriz de adjacncia G = (V,E) grafo com n vrtices, n 1 A a matriz de adjacncia de G com as propriedades:
nxn
A[i,j] = 1 a aresta (i,j) (ou <i,j>) est em E(G) A[i,j] = 0 se no existe aresta de i a j
Grau de um vrtice = somatria de sua linha A= 0 1 1 0 0 0 Grau Grau 0 1 0 de sada = soma da linha de entrada = soma da coluna
3 2
1 2 3 4
2 1 1 2
3 4 4 3
Exerccios
Calcular grau de um vrtice Verificar se 2 vrtices so adjacentes
Exerccio
Verificar se um grafo completo
Outras definies
Subgrafo de um grafo G: um grafo G tal que
V(G) V(G) E(G) E(G)
1 2 4 G 3 2
1 3 G
2 4 G 2
1 3 G
Outras definies
Caminhos: um caminho entre os vrtices u e v no grafo G uma sequncia
u, i1, i2, ...,ik, v tal que (u,i1), (i1,i2),..., (ik,v) so arestas em E(G), se G for no orientado <u,i1>,<i1,i2>,..., <ik,v> so arestas em E(G), se G for orientado
Outras definies
Comprimento de um caminho igual ao nmero de arestas nesse caminho. Caminho simples um caminho em que todos os vrtices exceto primeiro e ltimo aparecem uma nica vez. Ciclo um caminho simples em que o primeiro e o ltimo vrtices so os mesmos. Vrtices conectados: os vrtices u e v de um grafo so conectados se existe um caminho entre eles.
Operaes Elementares
Visitar todos os vrtices de um grafo G que so alcanados a partir de um vrtice v:
Visita em profundidade Visita em largura
Busca em profundidade
Visita iniciando de um vrtice v: Seleciona w adjacente de v ainda no visitado e faz busca a partir de w Se todos os vrtices adjacentes de v foram visitados, volta para vrtice anterior visitado que tem vrtice w no visitado e inicia busca a partir de w Se todos os vrtices j tiverem sido visitados, a busca termina.
Visita em profundidade
Estruturas de dados necessrias: Vetor para guardar rtulos dos vrtices:
char R[MAX];
Matriz de adjacncia:
typedef int matriz[MAX][MAX];
Visita em profundidade
void visitaprof(int v, matriz M, int n) /* visita inicialmente FALSE */ { int i; visita[v]=TRUE; printf(%c,R[v]); for (i=0;i<n;i++) if (!visita[i] && M[v][i]) visitaprof(i,M,n); }
Visita em largura
Visita v e adjacentes de v no visitados Visita vrtices adjacentes no visitados dos novos vrtices
A B D E H F C G
Visita em largura
void visitalargura(int v,matriz M, int n) { tfila f; int i; visita[v]=TRUE; inicia(&f); insere(&f,v); while (!vazia(&f)) { remove(&f,&v);printf(%c,R[v]); for (i=0;i<n;i++) if (!visita[i]&& M[v][i]) { insere(&f,i);visita[i]=TRUE; } } }
Vetor fazparte: se fazparte[i] for true, n i j tem distncia mnima conhecida (a partir do n atual) Vetor precede:
Precede[i] contm o n que precede o n i no menor caminho encontrado.
No final do algoritmo:
Distancia[fim] contm a menor distncia de ini a fim A partir de precede[fim], pode-se obter o caminho de menor custo.
Exemplo de grafo
0 10 1 50 2 20 Peso = 30 10 3 4 60 0 1 2 3 4 20 100
~ 10 ~ 30 100 ~ ~ 50 ~ ~ 10 60
Algoritmo
int caminhomenorcusto( int ini, int fim, int precede[MAX], int peso[MAX][MAX]) { int i,novadist,menor,datual,k,atual; boolean fazparte[MAX]; int distancia[MAX]; for (i=0;i<MAX;i++){ fazparte[i]=FALSE; distancia[i]=MAXINT; } fazparte[ini]=TRUE; distancia[ini]=0; atual=ini;
Algoritmo (cont.)
while (atual!=fim) { menor=MAXINT; datual=distancia[atual]; for (i=0;i<MAX;i++) if(!fazparte[i]){ novadist=datual+peso[atual][i]; if (novadist<distancia[i]){ precede[i]=atual; distancia[i]=novadist; if (distancia[i]<menor){ menor=distancia[i];k=i; } } } atual=k;fazparte[atual]=TRUE; } return distancia[atual]; }
0 0 1 2 3 4
~ 10 ~ 30 100 ~ ~ 50 ~ ~ 10 20 60
Exemplo de execuo
atual = 0
fazparte 0 1 2 3 4 T F F F F distancia 0 1 2 3 4 0 10 ~ ~ ~ menor = 10 datual= 0 (distancia[atual])
i=2
novadist = 0 + peso[0][2] = 0 + ~ = ~ distancia 0 1 2 3 4 0 10 ~ ~ ~ precede 0 1 2 3 4 0 menor = 10 k= 1
0 0 1 2 3 4
~ 10 ~ 30 100 ~ ~ 50 ~ ~ 10 20 60
Exemplo de execuo
atual = 0
fazparte 0 1 2 3 4 T F F F F distancia 0 1 2 3 4 0 10 ~ ~ ~ menor = 10 datual= 0 (distancia[atual])
i=3
novadist = 0 + peso[0][3] = 0 + 30 = 30 distancia 0 1 2 3 4 0 10 ~ 30 ~ (novadist) precede 0 1 2 3 4 0 0 (atual) menor = 10 k= 1
0 0 1 2 3 4
~ 10 ~ 30 100 ~ ~ 50 ~ ~ 10 20 60
Exemplo de execuo
atual = 0
fazparte 0 1 2 3 4 T F F F F distancia 0 1 2 3 4 0 10 ~ 30 ~ menor = 10 datual= 0 (distancia[atual])
i=4 0 1 2 3 4 20 0 1 2 3 4 ~ 10 ~ 30 100 ~ ~ 50 ~ ~ 10 60
novadist = 0 + peso[0][4] = 0 + 100 = 100 distancia 0 1 2 3 4 0 10 ~ 30 100 (novadist) precede 0 1 2 3 4 0 0 0 (atual) menor = 10 k= 1
Exemplo de execuo
atual = 1
fazparte 0 1 T T distancia 0 1 0 10 2 3 4 F F F 2 3 4 ~ 30 100
0 1 2 3 4 20 0 1 2 3 4 ~ 10 ~ 30 100 ~ ~ 50 ~ ~ 10 60
Exemplo de execuo
atual = 1
fazparte 0 1 2 T T F distancia 0 1 2 0 10 60 3 4 F F 3 4 30 100
0 1 2 3 4 20 0 1 2 3 4 ~ 10 ~ 30 100 ~ ~ 50 ~ ~ 10 60
Exemplo de execuo
atual = 1
fazparte 0 1 2 T T F distancia 0 1 2 0 10 60 3 4 F F 3 4 30 100
0 1 2 3 4 20 0 1 2 3 4 ~ 10 ~ 30 100 ~ ~ 50 ~ ~ 10 60
Exemplo de execuo
atual = 2
fazparte 0 1 2 3 4 T T T F F distancia 0 1 2 3 4 0 10 60 30 100
menor = ~ datual = 60 (distancia[atual]) i=4 0 1 2 3 4 20 0 1 2 3 4 ~ 10 ~ 30 100 ~ ~ 50 ~ ~ 10 60
Exemplo de execuo
atual = 4 (=fim)
fazparte 0 1 2 3 4 T T T F T distancia 0 1 2 3 4 0 10 60 30 70 70 a menor distncia Precede 0 1 2 3 4 0 1 0 2 caminho = 0 1 2 4