Estruturas de Dados - Grafos (implementação)

6.81k views2966 WordsCopy TextShare
UNIVESP
univesp.br Eixo de Computação - COM160 Univesp - Universidade Virtual do Estado de São Paulo Profes...
Video Transcript:
Olá meus caros alunos sejam bem-vindos a mais uma aula de estruturas de dados na hora de hoje nós vamos falar sobre gráficos Mais especificamente a implementação de grafos em C + + utilizando uma crise de adjacências como forma de representação o roteiro que eu vou seguir na aula de hoje será primeiramente eu vou falar sobre a estrutura de um nó a estrutura do conteúdo de um vértice depois eu falarei sobre os métodos que nós vamos implementar e depois eu darei alguns detalhes destas implementações primeiramente sobre a estrutura do nó mastro do nosso será contemplada por
essa classe ver se eu estou mostrando aqui para vocês não tem aqui dentro da classe burguesa que se não tem nenhum tipo de ponteiro isso será feito dessa forma por quê Porque nós utilizaremos Matriz de adjacência como forma de representação do degrau bom então essa classe aqui vai ficar bem simplificado Observe que essa criança tem apenas um atributo que é um atributo do tipo string o atributo nome vai ser o nome do vértice por exemplo eu vou dizer o vértice A o vértice b e assim por diante temos um método get que é o método
que vai retornar o nome do pé e aqui temos dos construtores um Construtor sem parâmetros que atribui o nome vazio as três vazia para o nome e um outro atributo que recebe o nome por parâmetro caso o usuário queira algo diferente de vazio e vamos falar agora sobre os métodos que nós vamos implementar tanto interface pública quanto à interface privada iniciando aqui com a interface da privada mas implementar emos um gráfico nessa Claro grave o internamento nós apresentaremos da seguinte forma primeiramente temos aqui um atributo chamado no esse atributo ele vai nos dizer quem com
quem com Que número eu quero representar o mar esta vazia Lembrando que nós vamos colocar as arestas dentro de uma matriz de adjacência Pode ser que um determinado grafo o zero ele não corresponde a uma aresta que não existe então quando eu quero representar a não existência de uma aresta eu vou utilizar um inteiro e esse inteiro ele vai ser o que estiver indicado em no pé como é se vai me dizer quem na matriz de adjacência não é uma aresta aqui eu tenho Max vértices será o número máximo diversas eu preciso alocar uma matriz
de adjacência antes de usar essa Matriz de adjacência Então eu tenho que ter para locar a matriz eu teria que ter uma estimativa do número de fé e eu não vou poder extrapolar o número de vértices em tempo de execução E aí e nessa outra variável que a variável num vértices eu vou dizer o número de versos que foram realmente adicionados nesse gravar Então aqui eu tenho o número máximo de vértices e aqui embaixo tem o número de vértices que eu realmente coloquei logo em seguida mais embaixo eu tenho esse vetor que é o vetor
vértice dentro dessa vectorvest não vou colocar todos os versos o melhor todos os objetos do tipo Vertix que foram alocados dentro desse grupo então vorpx e Esse asterisco aqui para indicar que é um ponteiro e esse ponteiro na verdade vai ser um vetor de ver clips Que objetos verdes e aqui nesse atributo seguinte eu tenho uma sim táxi que vocês acham que ainda não viram desse tá nessa disciplina que é uma sintática que tem dois asteristicos como ela tem dois asteristicos Isso significa que é diz é um ponteiro para ponteiros bom então por hora vamos
entender que essa notação aqui está declarando uma matriz de ponteiros entretanto pode ser essa notação seja usada para alguma coisa diferente de uma matriz com o próprio nome está dizendo é o tedx é um ponteiro e* é diz também é um ponteiro então por isso que teve as e duplo asteristico bem aqui mas adiante a vocês vão entender melhor quando eu inicializar essa Matriz de adjacências é e logo em seguida tenho esse vetor de booleano que seria o Max bom então para que serve esse morte em alguns algoritmos por exemplo os percursos em busca Um
percurso em largura e o percurso em profundidade nós precisamos marcar o vértice para não entrar em Loop Infinito para dizer olha eu já Visitei Esse verso Estou chegando nele de novo mas não vou visitar outra vez Então todo o algoritmo que precisar de uma marcação nos vértices pode utilizar receber torre de booleanos aqui e eu tenho um outro membro privado que seria esse Jet índice ele é importante porque nós temos uma matriz de adjacência e nós vamos afastar esta Matriz de adjacência pelos índices do Beetle entretanto usuário em alguns métodos vai passar o vértice e
não o índice desse vértice no vetor de ver o que que esse gatinho é que separar ele por exemplo terá uma lista de fé táxi e veste a o vértice B ao vértice C só que para usar a matriz de adjacência não adianta saber que o nome do veste é seu preciso dormir então pede ainda que se ele vai dizer olha o índice do vértice c na verdade é dois acesso na matriz de adjacência utilizando o índice de doce então para isso que ele vai servir mais adiante essa interface privada vamos seguir para interface pública
nós temos um construtora que esse Construtor ele vai receber o número de máximo de vértices que eu possa local nesse grupo e uma indicação e de quem vai indicar a ausência de aresta na minha Matriz adjacência Então esse int aqui vai indicar Olha quando não tem aresta use esse índice esse kit aqui o destrutor ele faz simplesmente desalocar a memória teremos dois métodos aqui um para adicionar ver se ele vai receber o ver que se como parâmetro e um para adicionar esta Como amar esta un par de veces e CP 2 objetos da classe BNDES
como parâmetro a nossa implementação nós vamos contemplar também grafos ponderados então esse Cintia que ele vai me dizer o peso daquela esta como eu volto informar o peso das aresta Em algum momento eu posso querer o peso que as arestas de volta então existe esse método get que vai me dizer tem aresta parece no sentido de dois vértices e vai me devolver o peso esse outro método aqui embaixo e se Guedes ele vai me retornar todos os vértices que são adjacentes a um determinado vértice de entrada eu vou reaproveitar uma estrutura de dados que nós
utilizamos anteriormente que a fila esse kill aqui então usuário e de usuário desse dessa desse método ele vai alocar uma fila depois ele vai informar essa fila e o veste do qual ele quer os adjacentes e esse método Gadgets como funciona os adjacentes dentro dessa fila para ser utilizada posteriormente os próximos três metros aqui eles vão gerenciar aquele a rede booleanos ou a rede Marcos onde ele vai dizer clímax ele vai remover todas as marcações morte ver que cê vai marcar um Vertix e esmalte vai verificar se um vértice ele está marcado ou não e
ao final nós podemos um método para imprimir a matriz nadinha de comando 1 e vamos falar primeiramente do Construtor em Assis 3M esses trem essas três primeiras linhas são apenas atribuição onde eu atribuo quem é o Edson o usuário informa ela tribo depois da tribo número máximo de vértices e depois eu atribuo zero para não vértices porque porque como eu criei essa estrutura agora ainda não adicionei nenhum verso então o número de vértices ainda exemplo aqui embaixo eu alloco um vetor o vetor de vértices e de trocar os vértices aqui nessa outra Daniel alloco o
vetor para as marcações booleanos para marcar os vértices e aqui eu coloco a minha Matriz essa minha Matriz ela vai ser alocada de um em dois terços a primeiramente ao alocar as linhas da matriz e percebam que as minhas da Matriz elas são ponteiros para inteiro eu vou desenhar aqui a minha Matriz como é que vai ser o e diz na verdade ele vai ser um ponteiro para um vetor onde cada elemento e aqui em si é um ponteiro também para outro vetor então cada célula receptores é um ponteiro para outro vetor onde nesse segundo
vetor aqui os elementos daí serão do tipo Enfim então todas as células aqui serão do tipo em como esses elementos serão do tipo int até o sei que esta célula aqui no vetor de X Ele é inte asteristico por quê Porque ele inicia um vetor do tipo Lins como eu sei que cada uma dessas células Aqui é do tipo ruins eu sei que apps é do tipo em** por quê Porque ele é um vetor cujo conteúdo das células é um interistico um ponteiro para inteiro e como eu inicializo isso também eu inicializo o primeiro as
linhas da minha Matriz que é o que eu faço nessa linha de pó bom e depois eu inicializo a coluna que seria esse vetor aqui então para cada uma das células da minha linha então para cada célula aqui da minha linha eu falo é desbrow = 1000 int.max ver Walmart dizendo que eu estou alocando agora esse vetor bem aqui espero que você tenha ficado Claro para vocês é apenas a sintaxe para criação de uma matriz e aqui nessas duas nessas três últimas linhas de código eu estou colocando em cada célula da Matriz o valor nulo
Ou melhor o valor que está em luedy O que é o valor que o meu usuário disse olha se você colocar esse valor na matriz de adjacência significa ausência de esta Então estou colocando em toda a matriz de adjacência que não tem área e e continuando agora no de instrutor o destrutor ele serve para deslocar tudo aquilo que foi feito no Construtor aqui o desloca objeto diverso daquele desloca o vetor de Marx aqui eu desloco todas as linhas da minha matrícula de assistência como eu aqui em dois tempos é voltei ao local em dois tempos
também primeiramente eu diz alloco todas as todos esses vetores aqui Então primeiramente aviso logo aqui e depois de desabafar com ela todos esses vetores de inteiros eu desloco na última linha o vetor de ponteiros para inteiros e continuando aqui esse é o método privado get index que é o método que vai receber um vértice onde pode ter por exemplo nome a e vai devolver um Lince desse vértice dentro do nosso vetor de vértices a que eu estou fazendo uma busca sequencial simplesmente para manter o código simples entretanto se você quiser um pouquinho mais deficiência um
pouquinho de melhor desempenho Talvez seja interessante eu tive modificar esse método porque ele é um método que é usado várias e várias vezes é e continuando aqui agora vamos começar esse primeiro método Esse é divertir com esse aqui usuária que vai adicionar um vértice no grupo o que que eu preciso fazer para adicionar Realmente eu preciso adicionar Esse verso que veio por parâmetro no meu vetor diversos não tem que aqui nessa minha estrutura de dados nessa minha nesse meu tipo abstrato de dados eu não tenho como remover um ver eu só posso adicionar nesse caso
o gerenciamento desse vetor diverso daquele é mais simples eu simplesmente coloco veste que chegou por último na última posição do meu vetor e daí o incremento o número de vértices mais um por quê porque chegou o novo vertis oi pra dicionário mar esta também é simples usuário informa os dois vértices no qual ele quer dizer olha entre esses dois vértices existe uma aresta e o primeiro utiliza o método get index II para saber e o vetor de vértices Qual é a posição desses vértices que o usuário me deu então obtendo a linha EA coluna porque
o tô chamando de linha coluna porque eu vou colocar esse leite que os olhos me passou na minha Matriz de adjacência então é a linha EA coluna da Matriz de adjacência onde eu vou colocar esse leite então aqui na minha Matriz de adjacência eu adiciono ele isso seria suficiente seu grau fosse direcionado se o grafo por não direcionado é preciso ainda adicionar esta última linha aqui para que a matriz é Diz ela vir e simétrica E como eu adiciono um ex na minha Matriz de adjacência Em algum momento eu posso precisar informar ao usuário qual
SP Zona Leste para informar o peso é um método muito semelhante ao anterior usuário vai me passar dois vértices o from books e o tio brix e daí eu pego os índices de citron Vert echoworx e coloca o respectivamente aqui nas variáveis grow e col porque o coloco Row e col porque a linha EA coluna da célula que eu vou acessar dentro da minha Matriz de adjacência para retornar material de Atenas para retornar para o usuário esse peso E aí e para obter a lista de acidente dá um dado vértice nós usaremos por comodidade uma
estrutura que já aprendemos em aulas anteriores A Fila então usuário vai passar o vértice do qual ele quer obter os adjacentes ele também vai me passar já locado a fila pode ele quer que eu coloco is adjacent que que eu vou fazer aqui eu vou primeiramente transformar esse verso que ele me passou em um inteiro que vai ser o índice de se tiver usando essa linha de código aqui aqui é a linha que inicializa e aqui é a Dinha que faz a declaração EA que eu tenho esse tio índice esse tio é que se ele
vai liderar Entre todos os vértices que já estão no gráfico Então se o tio ainda que C = 0 significa que eu quero ir decifrou ainda que se para esse tio inglês e assim por diante e o que que eu faço para dizer que existe um veste de acidentes eu tenho que verificasse na matriz de adjacência o valor que foi colocado O que é diferente de no AD dado que no AD significa aqui naquela posição não existe uma aresta Lembrando que é esse o formato da minha Matriz de adjacência só que aqui eu vou ao
invés de usar o a e b para indexar eu entendeu o index supor pelo IMS desse ai desse bebê dentro do vetor de verdes e esses três métodos como eu já falei anteriormente ele gerenciam o Array Marques que é uma rede booleanos que me disse um determinado o vértice já foi marcado ou não nesse primeiro eu limpo todas as marcações ou seja desmarcou todos os vértices nesse segundo método aqui eu marco um vértice específico usuário me passa o vértice quer marcar eu obtenho Mix no meu vetor e daí eu marco nesse índice dizendo olha agora
eu marquei estivesse aqui se você se o usuário quiser saber se um determinado versus está marcado ou não ele utiliza o método Smart Marques passando S vértice por parâmetro e aqui de novo eu obtenho incidence pé e verifique se ele foi marcado ou não e retorno para quem pediu ó e aqui o print Matrix ele vai varrer a minha Matriz de adjacência que é o meu que a minha Matriz aqui primeiro todas as linhas e depois todas as colunas e simplesmente imprimir o valor que está na matriz de adjacência na minha saída padrão Ou seja
ele vai imprimir na minha linha de comando se eu executar isso daqui pela linha de comando e por fim vamos ver como a gente utiliza essa estrutura que nós acabamos de criar primeiramente para utilizar essa estrutura o que que eu faço eu declaro o grafo Então essa clássico Acabei de gerar e esse é o objeto dessa classe e daí para cada vértice eu estou aqui dando essa figura aqui então para cada um dos vértices Eu crio o vértice por exemplo Vertix a = uso o Construtor verde que se dizendo que o nome dele é a
e logo em seguida eu adiciono bom então greve ponto é divertir-se à e faço isso primeiramente com todos aqui o Bê eu estou chamando de ver tem que saber e grave ponto é divertido receber daqui uns e o mesmo para obter e o mesmo Claro é bom então esse aqui é o primeiro passo qual seria o segundo passo adicionais arestas então por exemplo eu já tenho um vértice A e o vértice B Eu sei que existe uma aresta entre ele então eu crio ref. AD e aviso Quem são os vértices a e o b e
diga o que o peso da aresta que existe entre eles é dois também tem uma aresta entre a e c então eu faço o mesmo na mesma chamada ref. É diz de aparecer e o peso daqui é um o que é que é o final eu estou utilizando e grave ponto print Matrix ele vai pintar na tela a matriz que eu acabei de gerar e esse código aqui ele está todo esse código que eu falei na aula de hoje ele está no material de apoio recomendo que você olhe esse código dentro dos arquivos tente executar
esse código utilizando demais compilar utilizando demais e executar logo em seguida a Laura de hoje para aula de hoje era isso que eu precisava conversar com vocês se algo não ficou muito claro eu recomendo que assista a aula novamente até ficar satisfeito e depois você pode seguir para os próximos altos um forte abraço te vejo você nas próximas a E aí E aí
Copyright © 2024. Made with ♥ in London by YTScribe.com