/// <summary> /// Método que gera a árvore geradora mínima a partir do algoritmo de Prim /// Infelizmente esse método acopla a classe ao console, para que seja registrado o passo a passo da geração da árvore. /// </summary> /// <param name="v1">Vertice cabeça da árvore</param> /// <returns>Árvore Geradora mínima</returns> /// <exception cref="TipoGrafoException">Se o grafo for dirigido será lançada uma exceção</exception> public Grafo getAGMPrim(Vertice v1) { if (this.IsDirigido) { throw new TipoGrafoException(false); } int custo = 0; Grafo AGM = new Grafo(false); //cria o grafo da arvore geradora minima List <Vertice> verticesPercorridos = new List <Vertice>(); List <Aresta> arestasPercorridas = new List <Aresta>(); AGM.vertices.Add(new Vertice()); //adiciona o primeiro vertice verticesPercorridos.Add(v1); while (arestasPercorridas.Count() < this.vertices.Count()) //deve parar assim que adicionar n-1 arestas (n= num de vertices) { int menorArestaTamanho = int.MaxValue; //placeholder com o valor maximo Aresta menorAresta = null; //variavel que ira possuir a menor aresta foreach (Vertice vertice in verticesPercorridos) //para cada vertice percorrido vamos percorrer suas arestas { foreach (Aresta aresta in vertice.arestas) //para cada aresta de cada vertice vamos escolher a com menor tamanho { if (!arestasPercorridas.Contains(aresta)) //primeiro verificamos se a aresta ja foi percorrida { if (aresta.peso < menorArestaTamanho) //verificamos se achamos uma aresta com peso menor { menorArestaTamanho = aresta.peso; menorAresta = aresta; } } } } //apos acharmos a aresta com menor tamanho, vamos adicionar ela e o vertice ao grafo if (verticesPercorridos.Contains(menorAresta.origem)) //pequeno teste para saber qual o certo, origem ou destino { verticesPercorridos.Add(menorAresta.destino); Console.WriteLine("Vértice " + menorAresta.destino.id + " adicionado."); } else { verticesPercorridos.Add(menorAresta.origem); Console.WriteLine("Vértice " + menorAresta.origem.id + " adicionado."); } //adicionando a aresta... arestasPercorridas.Add(menorAresta); Console.WriteLine("Aresta " + menorAresta.id + " adicionada, seu peso é " + menorAresta.peso); custo += menorAresta.peso; //adiciona ao custo Console.WriteLine(); } Console.WriteLine("Custo total:" + custo); return(AGM); }
public static void Leitura(StreamReader arq) { int op = 1; int nv1 = 0; int nv2 = 0; string[] Linha = new string[4]; //Vetor que vai receber os dados do arquivo int vertices = int.Parse(arq.ReadLine()); //Numero dos vertices string linha = arq.ReadLine(); Linha = linha.Split(';'); Console.WriteLine("-Trabalho Pratico Algoritmo em grafos-"); Console.WriteLine("Integrantes: Vitor Ceolin & Fernando Bretz"); Grafo g = new Grafo(); if (Linha.Length == 3) { //Não é dirigido g = new Grafo(false, vertices); while (linha != null) { Linha = linha.Split(';'); //Pegando dados da linha Aresta aresta = new Aresta(g.vertices[int.Parse(Linha[0]) - 1], g.vertices[int.Parse(Linha[1]) - 1], int.Parse(Linha[2])); linha = arq.ReadLine(); //Pula linha } } else if (Linha.Length == 4) { //É dirigido g = new Grafo(true, vertices); while (linha != null) { Linha = linha.Split(';');//Pegando dados da linha if (Linha[3].Equals("1")) { Aresta aresta = new Aresta(g.vertices[int.Parse(Linha[0]) - 1], g.vertices[int.Parse(Linha[1]) - 1], int.Parse(Linha[2])); } else { Aresta aresta = new Aresta(g.vertices[int.Parse(Linha[1]) - 1], g.vertices[int.Parse(Linha[0]) - 1], int.Parse(Linha[2])); } linha = arq.ReadLine(); //Pula linha } } if (!g.IsDirigido) { while (op != 0) { //Menu de Metodos para grafo não dirigido Console.WriteLine("Escolha um metodo (grafo não dirigido):\n0-Sair\n1-isAdjacente()\n2-getGrau()\n3-isIsolado()\n4-isPendente()" + "\n5-isRegular()\n6-isNulo()\n7-isCompleto()\n8-isConexo()\n9-isEuleriano()\n10-isUnicursal()" + "\n11-getAGMPrim()\n12-getAGMKruskal()\n13-getCutVertices()"); op = int.Parse(Console.ReadLine()); switch (op) { case 1: Console.WriteLine("Qual será o primeiro vértice? (Escolha um numero entre 1-" + (g.vertices.Count) + ")"); nv1 = int.Parse(Console.ReadLine()); Console.WriteLine("Qual será o segundo vértice? (Escolha um numero entre 1-" + (g.vertices.Count) + ")"); nv2 = int.Parse(Console.ReadLine()); if (g.vertices[nv1 - 1].isAdjacente(g.vertices[nv2 - 1])) { Console.WriteLine("O vértice é adjacente."); } else { Console.WriteLine("O vértice não é adjacente."); } break; case 2: Console.WriteLine("Qual será o vértice? (Escolha um numero entre 1-" + (g.vertices.Count) + ")"); nv1 = int.Parse(Console.ReadLine()); Console.WriteLine("O grau é: " + g.vertices[nv1 - 1].getGrau()); break; case 3: Console.WriteLine("Qual será o vértice? (Escolha um numero entre 1-" + (g.vertices.Count) + ")"); nv1 = int.Parse(Console.ReadLine()); if (g.vertices[nv1 - 1].isIsolado()) { Console.WriteLine("O vértice é isolado."); } else { Console.WriteLine("O vértice não é isolado."); } break; case 4: Console.WriteLine("Qual será o vértice? (Escolha um numero entre 1-" + (g.vertices.Count) + ")"); nv1 = int.Parse(Console.ReadLine()); if (g.vertices[nv1 - 1].isPendente()) { Console.WriteLine("O vértice é pendente."); } else { Console.WriteLine("O vértice não é pendente."); } break; case 5: if (g.isRegular()) { Console.WriteLine("O grafo é regular."); } else { Console.WriteLine("O grafo não é regular."); } break; case 6: if (g.isNulo()) { Console.WriteLine("O grafo é nulo."); } else { Console.WriteLine("O grafo não é nulo."); } break; case 7: if (g.isCompleto()) { Console.WriteLine("O grafo é completo."); } else { Console.WriteLine("O grafo não é completo."); } break; case 8: if (g.isConexo()) { Console.WriteLine("O grafo é conexo."); } else { Console.WriteLine("O grafo não é conexo."); } break; case 9: if (g.isEuleriano()) { Console.WriteLine("O grafo é Euleriano."); } else { Console.WriteLine("O grafo não é Euleriano."); } break; case 10: if (g.isUnicursal()) { Console.WriteLine("O grafo é Unicursal."); } else { Console.WriteLine("O grafo não é Unicursal."); } break; case 11: Console.WriteLine("Qual será o vértice? (Escolha um numero entre 1-" + (g.vertices.Count) + ")"); nv1 = int.Parse(Console.ReadLine()); g.getAGMPrim(g.vertices[nv1 - 1]); break; case 12: Console.WriteLine("Qual será o vértice? (Escolha um numero entre 1-" + (g.vertices.Count) + ")"); nv1 = int.Parse(Console.ReadLine()); g.getAGMKruskal(g.vertices[nv1 - 1]); break; case 13: Console.WriteLine("O número de cut-vértices é: " + g.getCutVertices()); break; default: Console.WriteLine("Opção invalida :("); break; } } } else { while (op != 0) { //Menu de Metodos para grafo dirigido Console.WriteLine("Escolha um metodo (grafo dirigido):\n0-Sair\n1-getGrauEntrada()\n2-getGrauSaida()\n3-hasCiclo()"); op = int.Parse(Console.ReadLine()); switch (op) { case 1: Console.WriteLine("Qual será o vértice? (Escolha um numero entre 1-" + (g.vertices.Count) + ")"); nv1 = int.Parse(Console.ReadLine()); Console.WriteLine("O grau de entrada do vértice é: " + g.getGrauEntrada(g.vertices[nv1 - 1])); break; case 2: Console.WriteLine("Qual será o vértice? (Escolha um numero entre 1-" + (g.vertices.Count) + ")"); nv1 = int.Parse(Console.ReadLine()); Console.WriteLine("O grau de saida do vértice é: " + g.getGrauSaida(g.vertices[nv1 - 1])); break; case 3: if (g.hasCiclo()) { Console.WriteLine("O grafo possui ciclo."); } else { Console.WriteLine("O grafo não possui ciclo."); } break; default: Console.WriteLine("Opção invalida :("); break; } } } }