CES11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Prticas

  • Slides: 15
Download presentation
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas - 2020 Capítulo V Grafos

CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas - 2020 Capítulo V Grafos

n Este laboratório corresponde ao Exame de CES-11/2020 n Objetivos deste laboratório: 1. Ler

n Este laboratório corresponde ao Exame de CES-11/2020 n Objetivos deste laboratório: 1. Ler de um arquivo os dados de um digrafo e armazenalos numa estrutura de listas de adjacências - Na realidade, os dados são o número de vértices do digrafo e os adjacentes de cada vértice - Cada um dos vértices do digrafo deve ter um campo para indicar se já foi ou não visitado, e outro campo para o número de visitação, campos estes a serem usados em eventuais buscas em profundidade 2. Formar para cada vértice sua lista de contraadjacências, ou seja, a lista de todos os vértices dos quais ele é adjacente.

3. Escrever na tela sua estrutura de listas de adjacências, com as informações nos

3. Escrever na tela sua estrutura de listas de adjacências, com as informações nos vértices, incluindo não só os adjacentes, mas também os contra-adjacentes dos vértices 4. Responder se ele é cíclico ou acíclico 5. Se for acíclico, encontrar e imprimir uma de suas possíveis ordenações topológicas 6. Se for cíclico, encontrar e imprimir os vértices e os arcos de cada um de seus componentes fortemente conexos

Exercício 5. 1: Leitura e armazenamento de digrafos Fazer um programa para: n Ler

Exercício 5. 1: Leitura e armazenamento de digrafos Fazer um programa para: n Ler de um arquivo os dados sobre um digrafo, ou seja, seu número de vértices e os adjacentes de cada vértice n Armazenar o digrafo numa estrutura de listas de adjacências n Escrever na tela todo o conteúdo de sua estrutura de listas de adjacências

Declarações para digrafos: 1 3 2 typedef int vertice; struct Celula. Adj; struct Celula.

Declarações para digrafos: 1 3 2 typedef int vertice; struct Celula. Adj; struct Celula. Vertice; struct Grafo; struct Celula. Adj { vertice vert; Celula. Adj *prox; }; visit nvisit 5 2 1 -1 -1 2 -1 -1 5 3 -1 -1 1 4 -1 -1 5 ● 3 ● 5 -1 -1 G Espaco. Vertices nvert 4 4 ● ● 5 aciclico -1

struct Celula. Vertice { A serem logic visit; preenchidos em busca prof int nvisit;

struct Celula. Vertice { A serem logic visit; preenchidos em busca prof int nvisit; Celula. Adj *listadj; A ser alocado }; dinamicamente (malloc) 1 2 3 struct Grafo { Celula. Vertice *Espaco. Vertices; int nvert; logic aciclico; visit nvisit }; 1 -1 -1 A ser preenchido 2 -1 -1 mais adiante 3 -1 -1 /* Variaveis globais */ 4 -1 -1 Grafo G; 5 -1 -1 FILE *filein; G Espaco. Vertices 5 2 5 4 ● ● 1 5 ● 3 ● nvert 4 5 aciclico -1

/* Prototipos de funcoes */ void Ler. Grafo (Grafo *); void Escrever. Grafo (Grafo

/* Prototipos de funcoes */ void Ler. Grafo (Grafo *); void Escrever. Grafo (Grafo *); /* Programa Principal: */ int main () { /* Leitura e escrita do grafo */ filein = fopen ("Dados. Grafo. dat", "r"); Ler. Grafo (&G); printf ("n. Grafo G em fase inicialn"); Escrever. Grafo (&G); printf ("nn"); system ("pause"); return 0; }

Exemplo: para o digrafo Possível arquivo de entrada: 5 1 2 1 4 2

Exemplo: para o digrafo Possível arquivo de entrada: 5 1 2 1 4 2 5 3 1 3 4 4 5 5 3 6 3 -1 4 0 1 3 2 Número de vértices 5 Arcos: 2 vértices visit nvisit 2 1 -1 -1 2 -1 -1 5 3 -1 -1 1 4 -1 -1 5 ● 3 ● 5 -1 -1 Encerra a leitura quando o primeiro vértice for zero G Espaco. Vertices 4 nvert 4 ● ● 5 aciclico -1

Exemplo: para o digrafo Possível arquivo de entrada: 5 1 2 1 3 1

Exemplo: para o digrafo Possível arquivo de entrada: 5 1 2 1 3 1 4 2 5 3 4 3 5 4 5 6 3 -1 4 0 Arcos errados e repetidos: 1 3 2 4 Devem ser ignorados 5 Não encerrar o programa se aparecerem visit nvisit 2 1 -1 -1 2 -1 -1 5 3 -1 -1 1 4 -1 -1 5 ● 3 ● 5 -1 -1 G Espaco. Vertices nvert 4 ● ● 5 aciclico -1

Possível saída na tela: visit nvisit 1 2 3 4 5 -1 -1 -1

Possível saída na tela: visit nvisit 1 2 3 4 5 -1 -1 -1 Espaco. Vertices 2 5 1 ● 5 ● 3 ● nvert 5 4 ● aciclico -1 1 2 3 5 4

Exercício 5. 2: Construção da lista de contraadjacências de cada vértice (substitui o digrafo

Exercício 5. 2: Construção da lista de contraadjacências de cada vértice (substitui o digrafo reverso) n Contra-adjacente de um vértice v é um vértice do qual v é adjacente n No programa anterior: Acrescentar o campo listcontradj ao tipo Celula. Vertice struct Celula. Vertice { logic visit; int nvisit; Celula. Adj *listadj, *listcontradj; };

Exemplo: no digrafo anterior 1 3 2 4 5 1 sua estrutura com as

Exemplo: no digrafo anterior 1 3 2 4 5 1 sua estrutura com as contra-adjacências: 3 2 4 visit nvisit -1 -1 2 5 -1 5 1 ● 5 Espaco. Vertices 4 ● 1 5 ● 2 nvert 3 4 ● 3 -1 ● 3 1 G 4 5 conexo -1

Exercício 5. 3: Fazer o teste de aciclicidade no digrafo lido Sugestão: implementar o

Exercício 5. 3: Fazer o teste de aciclicidade no digrafo lido Sugestão: implementar o algoritmo e a estratégia apresentados no Capítulo VII das aulas teóricas Poderão ser acrescentados novos campos às structs Celula. Vertice e Celula. Adj

Exercício 5. 4: Se o digrafo for acíclico: n Encontrar e escrever na tela

Exercício 5. 4: Se o digrafo for acíclico: n Encontrar e escrever na tela uma de suas possíveis ordenações topológicas Sugestão: implementar o algoritmo e a estratégia apresentados no Capítulo VII das aulas teóricas

Exercício 5. 5: Se o digrafo for cíclico, encontrar os seus componentes fortemente conexos

Exercício 5. 5: Se o digrafo for cíclico, encontrar os seus componentes fortemente conexos n Numerar cada vértice e cada arco do digrafo com o número do componente fortemente conexo ao qual pertence n Escrever na tela os vértices e os arcos de cada um desses componentes Usar o algoritmo de Kosaraju apresentado no Capítulo VII das aulas teóricas Poderão ser acrescentados novos campos às structs Celula. Vertice e Celula. Adj