Sunteți pe pagina 1din 7

Universidade Federal da Bahia Instituto de Matemtica Departamento de Cincia da Computao

Projeto em Grafos
MAT156 - Teoria dos Grafos Profa. Fabola Gonalves Pereira Greve Classe GRAFO Mtodos Pblicos Construtor(); Destrutor(); Display(); Display_Ordem(); Busca_Profundidade(); Busca_Largura(); Ordem_Topolgica(); Arvore_Geradora_Min(); Componentes_Conexas(); Encontre_Ciclo(); Colorao_Mnima(); Caminho_Minimo (vrtice); Fim Classe Classe GRAFO Estado Constantes N = |V|

M = |E|

(valores mximos para |V| e |E|)

Classe VRTICE (informaes que caracterizam um vrtice) ident: inteiro; (identificao) info: string; (nome associado ao vrtice) visita: inteiro; (guarda ordem de visita do vrtice na realizao de uma busca) cor: inteiro; (cor do vrtice na realizao da colorao) label: inteiro; (guarda rtulo do vrtice na realizao do caminho mnimo) topo: inteiro; (ordem de visita topolgica do vrtice) indegree: inteiro; (grau de entrada do vrtice) component: inteiro; (nmero da componente que o vrtice faz parte) on_path: boolean; (auxiliar para determinar se vrtice est em caminho) adj: Lista; (lista de vrtices adjacentes) Fim Classe

Objetos m: n: vert: Mtodos Pblicos Construtor () Leitura (n, m); Para

qtde real de arestas do grafo; qtde real de vrtices do grafo; vetor [1..n] de vertices; (vetor que representa os vrtices)

(leitura do qtde de vrtices e arestas do grafo)

i = 1 at n faa (fornecimento das informaes de cada vrtice) leitura (vert[i].info); (inicializa todos os campos dos vrtices);; FimPara

% Pedir para usurio determinar se grafo orientado (S) ou no (N) % Leitura das arestas Para i = 1 at m faa leitura (v,w); (leitura da aresta com extremos v e w) (gerar djacncia para v) vert[v].adj = w; (gerar adjacncia para w) % caso grafo no seja orientado vert[w].adj = v; FimPara Display () (Exibio do grafo na tela do computador na forma : (v,w) (y,z), ... Display-Ordem () (Exibio da ordem de visita de cada vrtice, obtida a partir da realizao de um algoritmo (busca, ordenao topolgica, etc.) Display-Caminho (u0) (Exibio dos caminhos realizaos no grafo do vrtice u0 at todos os demais vrtices o grafo). Busca_Profundidade (v, pr_Work , ps_Work ) % Para Grafos e Dgrafos ordem = ordem + 1 ; v.visita = ordem; pr_Work (v) ; (preWork depende do algoritmo que usa a busca como mtodo auxiliar) Para todas as arestas (v,w) faa Se (w.visita = 0) ento Busca_Profundidade (w); ps_Work (v, w) ; (psWork na aresta depende do algoritmo que usa a busca como mtodo auxiliar) FimPara

Busca_Largura (v, pr_Work , ps_Work ) % grafos quaisquer ordem = ordem + 1 ; v.visita = ordem; fila.Inserir (raiz); Enquanto fila.No-Vazia () faa w = fila.Remover (); pr_Work (w) ; (preWork depende do algoritmo que usa a busca como mtodo auxiliar) Para todas as arestas (w, x) faa Se (x.visita = 0) (x ainda no foi visitado) ento ordem = ordem + 1; x.visita = ordem; fila.Inserir (x); FimSe FimPara FimEnquanto Componentes_Conexas () % Para grafos n o orientados componente_numero = 1; Para v = 1 at n faa Se (vert[v].visita = 0) ento Busca_Profundidade (v, Pr_Work, Ps_Work); componente_numero = componente_numero + 1; FimPara Pr_Work (v) v.component = componente_numero + 1; Ps_Work() (no precisa) int Distncia (v) (Determina distncia de v a todos os demais vrtices do grafo) % Uso de Busca em Largura. Dimetro (w) (Determina dimetro do grafo) % Uso de Distncia(v) para todo vrtice do Grafo. Gafro_Acclico () % Deterrmina se grafo acclico ou no

int

Boolean

% Iniciar uma busca em prof. A partir de vrtice x arbitrrio. Busca_Profundidade (x, Pr_Work, Ps_Work); Pr_Work (v) v.on_path = true; (v.on_path = true se o vrtice v encontra-se no caminho a partir da raiz inicial x. Inicialmente, on_path = false para todos os vrtices de G). Ps_Work (v,w) Se (w.on_path = true) ento

Grafo_Acclico () = false; return(); Se (w o ltimo vrtice na lista de adjacentes de v) ento v.on_path = false; Ordem_Topolgica () 1. Inicializa v.indegree para todo vrtice de G usando algoritmo de busca; 2. Para v = 1 at n faa Se (vert[v].indegree = 0) ento fila.Insere(v); FimPara 3. Enquanto fila.NoVazio() faa v = fila.Remove();; ordem_topo = ordem_topo + 1; v.topo = ordem_topo; Para todas as arestas (v,w) faa w.indegree = w.indegree - 1; Se (w.indegree = 0) ento fila.Insere(w); FimPara Avore_Geradora_Min () (Soluo baseada no algoritmo de Kruskall) 1. Ordenar arestas do grafo G de acordo com o seu peso. 2. Enquanto qtde de arestas de T (rvore geradora) < |V| - 1 faa 2.1 Escolha aresta ek = (vi, vj) de G, tal que i) ek.peso() to pequeno quanto possvel ' ii) T [e1, e2, ..., ek-1, ek] acclico. T a rvore geradora sendo formada, que contm as arestas e1, ..., ek do grafo G. Obs.: Para verificar se T + ek acclico, realizar Busca_Profundidade entre seus extremos (vi, vj). 2.2 G = G ek; T = T + ek Colorao_Mnima () (Algoritmo aproximado de colorao Heurstica: os vrtices de maior grau tm prioridade na colorao ) 1. Ordena vrtices de acordo com o seu grau e coloca vrtices numa estrutura. 2. Para k = 1 at n faa f(k) = 0; (f (k) = v indica que vrtice v adjacente a algum outro de cor k.) 3. Para v = 1 at n faa v.cor = 0; 4. Para v = 1 at n faa (retira vrtice da estrutura por ordem no-crescente de graus)

Para todo vrtice w adjacente a v faa Se (w.cor diferente de zero) ento f(w.cor) = v; FimPara c = 1; Enquanto v.cor = 0 faa Se f(c) diferente de v) ento v.cor = c; Seno c = c + 1; FimEnquanto Caminho_Mnimo (u0) (Soluo baseada no algoritmo de Djkstra) (A funo tambm pode ser modificada para exibir caminho mnimo de u0 at v especfico: Cam_Minimo (u0, v)) (Inicializao) label (u0) = 0 ; // u0 o vrtice origem Set = {u0}; // Set o conjunto de vrtices em que j foram obtidos // caminhos mnimos. Cset = V - Set; // CSet = complemento de Set. x = u0; // x o ltimo vrtice acrescentado a Set /* Procedimento j realizado no construtor Para todo vrtice v diferente de u0 faa v.label = infinito; // infinito corresponde a valor muito grande fimpara */ (Caminho Mnimo) Para i = 0 at n - 1 faa // para todos os vrtices

Para (todo vrtice v em Cset e que seja ajacente a x) faa v.label = min { v.label; x.label + peso (x,v) } fimpara // determinar mnimo label dentre todos os vrtices de Cset x = min {v.label, para todo vrtice v em Cset}; Set = Set + x; CSet = CSet - x; Fimpara Fim Classe Exemplo de Programa Principal // acrescentar o vrtice x a Set; // retirar o vrtice x de CSet

Incio % Um exemplo de programa GRAFO G; (instanciao do objeto) G.Display(); (exibio total do objeto) G.Busca_Profundidade(); G.Display_Ordem(); G.Ordem_Topolgica(); G.Display_Ordem(); G.Cam_Mnimo(1); (efetua cam_mnimo a partir de vrtice 1) G.Display_Caminho (); (exibio dos caminhos de 1 at demais vrtices do grafo) Fim DESCRIO DO PROJETO 1. Implementao em C++ ou JAVA padro usar bibliotecas especficas a am . No bientes ou mquinas. 2. A modelagem em objetos, assim como os algoritmos que implementam os mtodos, no esto completas, o aluno deve complet-los. 3. Informar professora caso seja encontrada alguma inconsistncia nos algoritmos fornecidos. Entrada/Sada Formato de entrada para a realizao dos testes. O programador deve dar a opo de leitura de entrada tanto via linha de comando como via arquivo. Entrada textual no seguinte formato: qtde de vrtices e arestas, informaes de cada vrtice, determinao se grafo orientado (S) ou no (N), enumerao das arestas, separadas por linhas. Segue template abaixo: |V|, |E| <newline> string1 <newline> string2 <newline> ... stringn <newline> S ou N <newline> int1, int2 <newline> int3, int4 <newline> ... Exemplo: suponha o K3. 3,3 a b c N 1,2 2,3 3,1

O programador tem tambm a opo de realizar a entrada de maneira on-line, via a ferramenta Rox (http://www.mycgiserver.com/~ugosan/rox/), ou atravs de formato de entrada prprio. Sada: o programador tem liberdade para a escolha do formato de sada.

S-ar putea să vă placă și