Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        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;
                    }
                }
            }
        }