Você está na página 1de 38

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 orientados (Dgrafos)


Cada aresta representada por um par direcionado. <u,v> e <v,u> so arestas diferentes. Exemplo: V = {1,2,3} E = {<1,2>,<2,1>,<2,3>}
1 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

Grafos Ponderados (redes)


Grafo em que cada aresta tem um peso que pode representar:
Distncia entre vrtices Custo de ir de um vrtice a outro

Definio Grau de um vrtice


Grau de um vrtice o nmero de arestas incidentes no vrtice. Para grafos orientados:
Grau de entrada Grau de sada

1 Grau de entrada do vrtice 2 = 1 Grau de sada do vrtice 2 = 2 Grau do vrtice 2 = 3

Definio Vrtices adjacentes


Dado grafo G com vrtices u e v
se a aresta (u,v) pertence ao conjunto E de arestas do grafo, u e v so adjacentes

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

Representao de Grafos - Matrizes


Matriz de adjacncia exemplo
1 2 4 3 A= 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0

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

Representao de Grafos - Listas


Listas de adjacncias: vetor de listas de adjacentes.
Exemplo: 1 2 4 3

1 2 3 4

2 1 1 2

3 4 4 3

Exerccios
Calcular grau de um vrtice Verificar se 2 vrtices so adjacentes

Definio Grafo completo


Grafo completo: existe uma aresta entre quaisquer pares de vrtices.
Nmero mximo de arestas para n vrtices: No orientado: n(n-1)/2 Orientado: n(n-1)

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 - Exemplo


A B D E H Visita em profundidade - ABDHEFCG F C G

Visita em profundidade
Estruturas de dados necessrias: Vetor para guardar rtulos dos vrtices:
char R[MAX];

Vetor para guardar se um vrtice foi visitado:


typedef enum {FALSE,TRUE} boolean; boolean visita[MAX]; /* inicialmente FALSE */

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

Busca em largura - ABCDEFGH

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; } } }

Algoritmo do menor caminho


De Dijkstra Retorna o custo do menor caminho do vrtice ini at o vrtice fim. Estruturas de dados:
Matriz peso: peso[i][j] contm o peso da aresta (i,j) Vetor distancia:
Distancia[i]: custo do menor caminho de vrtice ini at i

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]; }

Exemplo de execuo caminho de 0a4


atual = 0
fazparte 0 1 2 3 4 T F F F F distancia 0 1 2 3 4 0 ~ ~ ~ ~ menor = ~ datual= 0 (distancia[atual])
i=1
novadist = 0 + peso[0][1] = 0 + 10 = 10 distancia 0 1 2 3 4 0 10 ~ ~ ~ (novadist) precede 0 1 2 3 4 (atual) 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=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

menor = ~ datual = 10 (distancia[atual]) i=2

novadist = 10 + peso[1][2] = 10 + 50 = 60 distancia 0 1 2 3 4 0 10 60 30 100 precede 0 1 2 3 4 0 1 0 0 menor = 60 k= 2

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

menor = 60 datual = 10 (distancia[atual]) i=3

novadist = 10 + peso[1][3] = 10 + ~ = ~ distancia 0 1 2 3 4 0 10 60 30 100 precede 0 1 2 3 4 0 1 0 0 menor = 60 k= 2

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

menor = 30 datual = 10 (distancia[atual]) i=4

novadist = 10 + peso[1][4] = 10 + ~ = ~ distancia 0 1 2 3 4 0 10 60 30 100 precede 0 1 2 3 4 0 1 0 0 menor = 60 k= 2

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

novadist = 60 + peso[2][4] = 60 + 10 = 70 distancia 0 1 2 3 4 0 10 60 30 70 precede 0 1 2 3 4 0 1 0 2 menor = 70 k= 4

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

Você também pode gostar