示例#1
0
        /// <summary>
        /// Um grafo complementar é um grafo resultante de outro grafo, um grafo complementar possui vértices e arestas necessárias para tornar um grafo completo
        /// </summary>
        /// <returns>Um grafo complementar</returns>
        public GNaoDirigido GetComplementar()
        {
            GNaoDirigido Gcomplementar;
            ListaVertice verticesAux = new ListaVertice();
            ListaAresta  arestasAux  = new ListaAresta();

            if (IsCompleto())
            {
                return(this);
            }

            else
            {
                int       pos = 0;
                Vertice[] aux = vertices.GeraVetor();

                while (pos < aux.Length)
                {
                    for (int i = 0; i < aux.Length - 1; i++)
                    {
                        if (!IsAdjacente(aux[pos], aux[i + 1]))// Comparando os vértices e verificando se há adjacência entre eles
                        {
                            Vertice clone  = new Vertice(aux[pos].Nome);
                            Vertice clone2 = new Vertice(aux[i + 1].Nome);

                            if (verticesAux.BuscarVertice(clone) != null)
                            {
                                clone = (Vertice)verticesAux.Buscar(clone);
                            }

                            if (verticesAux.BuscarVertice(clone2) != null)
                            {
                                clone2 = (Vertice)verticesAux.Buscar(clone2);
                            }

                            Aresta auxA = new Aresta(clone, clone2, 0);

                            arestasAux.Adicionar(auxA);

                            if (verticesAux.BuscarVertice(clone) == null)
                            {
                                verticesAux.Adicionar(clone);
                            }

                            clone.Arestas.Adicionar(auxA);

                            if (verticesAux.BuscarVertice(clone2) == null)
                            {
                                verticesAux.Adicionar(clone2);
                            }

                            clone2.Arestas.Adicionar(auxA);

                            vertices.BuscarVertice(clone).Arestas.Adicionar(auxA);
                            vertices.BuscarVertice(clone2).Arestas.Adicionar(auxA);
                        }
                    }
                    pos++;
                }
                Gcomplementar = new GNaoDirigido(verticesAux, arestasAux);
                return(Gcomplementar);
            }
        }
示例#2
0
        /// <summary>
        /// Método para gerar o grafo
        /// </summary>
        /// <param name="caminho">o arquivo que o usuário informa</param>
        /// <returns>Retorna um grafo</returns>
        protected Grafo GeraGrafo(Stream caminho)
        {
            Grafo        g;
            ListaVertice vertices = new ListaVertice();
            ListaAresta  arestas  = new ListaAresta();

            string arquivo = LeitorArquivo.LerArquivo(caminho);              //As linhas do arquivos sem tratamento

            string[] infoGrafo     = LeitorArquivo.FormatarArquivo(arquivo); // Vetor com o arquivo tratado
            string[] linhasArquivo = arquivo.Replace("\r", "").Split('\n');  //Vetor com as linhas do arquivo (utilizada no for para gerar o grafo)

            this.IsDigrafo(arquivo);

            //é orientado
            if (digrafo)
            {
                g = new GDirigido();

                vertices.GerarLista(int.Parse(infoGrafo[0]));

                for (int i = 1; i < infoGrafo.Length; i = i + 4)
                {
                    //Lista de arestas

                    Aresta auxA;

                    if (int.Parse(infoGrafo[i + 3]) == 1) //Se a aresta tem direção 1, cria a aresta com origem e destino na sequencia informada
                    {
                        Vertice auxVo = vertices.BuscarVertice(new Vertice(Convert.ToInt32(infoGrafo[i])));
                        Vertice auxVd = vertices.BuscarVertice(new Vertice(Convert.ToInt32(infoGrafo[i + 1])));


                        auxA = new Aresta(auxVo, auxVd, int.Parse(infoGrafo[i + 2]));
                        arestas.Adicionar(auxA);
                    }
                    else //se não, cria a aresta com origem e destino na direção inversa
                    {
                        Vertice auxVo = vertices.BuscarVertice(new Vertice(Convert.ToInt32(infoGrafo[i + 1])));
                        Vertice auxVd = vertices.BuscarVertice(new Vertice(Convert.ToInt32(infoGrafo[i])));


                        auxA = new Aresta(auxVo, auxVd, int.Parse(infoGrafo[i + 2]));
                        arestas.Adicionar(auxA);
                    }


                    if (vertices.Buscar(auxA.Origem) == null)
                    {
                        vertices.Adicionar(auxA.Origem);
                        vertices.BuscarAdicionarOrigem(auxA);
                    }
                    else
                    {
                        vertices.BuscarVertice(auxA.Origem).Arestas.Adicionar(auxA);
                    }

                    if (vertices.Buscar(auxA.Destino) == null)
                    {
                        vertices.Adicionar(auxA.Destino);
                        vertices.BuscarAdicionarDestino(auxA);
                    }
                    else
                    {
                        vertices.BuscarVertice(auxA.Destino).Arestas.Adicionar(auxA);
                    }
                }
                return(g = new GDirigido(vertices, arestas, digrafo));
            }
            else //Não é orientado
            {
                g = new GNaoDirigido();

                try
                {
                    vertices.GerarLista(int.Parse(infoGrafo[0]));

                    for (int i = 1; i < infoGrafo.Length; i = i + 3)
                    {
                        //Lista de arestas

                        Vertice auxVo = vertices.BuscarVertice(new Vertice(Convert.ToInt32(infoGrafo[i])));
                        Vertice auxVd = vertices.BuscarVertice(new Vertice(Convert.ToInt32(infoGrafo[i + 1])));


                        Aresta auxA = new Aresta(auxVo, auxVd, int.Parse(infoGrafo[i + 2]));
                        arestas.Adicionar(auxA);

                        if (vertices.Buscar(auxA.Origem) == null)
                        {
                            vertices.Adicionar(auxA.Origem);
                            vertices.BuscarAdicionarOrigem(auxA);
                        }
                        else
                        {
                            vertices.BuscarVertice(auxA.Origem).Arestas.Adicionar(auxA);
                        }

                        if (vertices.Buscar(auxA.Destino) == null)
                        {
                            vertices.Adicionar(auxA.Destino);
                            vertices.BuscarAdicionarDestino(auxA);
                        }
                        else
                        {
                            vertices.BuscarVertice(auxA.Destino).Arestas.Adicionar(auxA);
                        }
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("O arquivo informado está em um formato incorreto", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    MessageBox.Show("O arquivo deve seguir esse padrão: (Exemplo)\n3\n1; 2; 7\n1; 3; 3\n2; 3; 10", "Correção", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return(null);
                }

                return(g = new GNaoDirigido(vertices, arestas));
            }
        }