/// <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); } }
/// <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)); } }