public static Grafos Corte(Grafos ArvoreMinima, int k) { List <celula> Arestas = new List <celula>(); for (int x = 0; x < ArvoreMinima.GetVertices; x++) { for (int y = 0; y < ArvoreMinima.Get_N_arestas(x); y++) { Arestas.Add(ArvoreMinima.GetAresta(x, y)); } } List <celula> listaOrdenada = Arestas.OrderByDescending(c => c.Getpeso).ToList(); //deletar k arestas de maior peso //fazer função imprime componentes // k-1 pois a quantidade de cortes deve ser igual a quantidade de professores menos 1 para se formar quantidades iguais de grupos // ex se for 2 prof serao 1 corte for (int x = 0; x < (k - 1) * 2; x++) //k*2 por conta da necessidade de deletar a aresta nas 2 direções { ArvoreMinima.DeletarArestar(listaOrdenada[x].GetOrigem, listaOrdenada[x].GetDestino, listaOrdenada[x].Getpeso); } Console.WriteLine("\nArvore Minima com K: " + (k - 1) + " Cortes"); ArvoreMinima.ImprimeGrafo_Completo(); Console.WriteLine(); return(ArvoreMinima); }
public static Grafos IniciaGrafo(int Tamanho) { List <celula>[] Lista = new List <celula> [Tamanho]; List <celula>[] Complementar = new List <celula> [Tamanho]; // grafo complementar ao grafo for (int x = 0; x < Tamanho; x++) /* inicializa os V elementos do vetor */ { Lista[x] = new List <celula>(); } // ------------------------------------------------ Grafos demo = new Grafos(Tamanho, Lista); return(demo); }
public static Grafos IniciaComplementar(int Tamanho) { int txt = Tamanho; List <celula>[] Complementar = new List <celula> [txt]; // grafo complementar ao grafo 1 // ------------------------------------------------ for (int x = 0; x < txt; x++) /* inicializa os V elementos do vetor */ { Complementar[x] = new List <celula>(); } Grafos Grafo2 = new Grafos(Tamanho, Complementar); return(Grafo2); }
public static void Inicia(List <aluno> Alunos, List <List <int> > Matriz, List <Tema> Temas) { Console.WriteLine("Digite o numero de professores disponiveis"); // K precisa ser maior que o numero de alunos int K = int.Parse(Console.ReadLine()); while (K > Alunos.Count()) { Console.WriteLine("Numero Invalido, Digite um numero valido."); K = int.Parse(Console.ReadLine()); } //Console.WriteLine("Digite a taxa de dissimilaridade maxima"); //int Dissimilaridade = int.Parse(Console.ReadLine()); //int razao = Dissimilaridade / K; // - - - Grafos demo = IniciaGrafo(Temas.Count()); // // temas/profesores = media de temas por professores ou razao for (int x = 0; x < Matriz.Count(); x++) { for (int y = x + 1; y < Matriz.Count(); y++) // y = x+1 para ler apenas a diagonal de cima da matriz { demo.AdicinarAresta(x, y, Matriz[x][y]); //if (Matriz[x][y] < Dissimilaridade) //{ // // se a dissimilaridade entre 2 temas for menos ou igual a um valor pre determinado // // adiciona uma aresta entre os temas // demo.AdicinarAresta(x, y, Matriz[x][y]); //} } } Console.WriteLine("\nGrafo Original"); demo.ImprimeGrafo_Completo(); Grafos ArvoreMinima = new Grafos(Temas.Count(), demo.Kruskul()); Console.WriteLine("\nArvore Minima"); ArvoreMinima.ImprimeGrafo_Completo(); ArvoreMinima = Corte(ArvoreMinima, K); // alunos // Cod do aluno / cod tema // temas // cod do tema / nome List <List <int> > Grupos_De_Orientacao = new List <List <int> >(); Grupos_De_Orientacao = ArvoreMinima.Get_Componentes_conexos(Grupos_De_Orientacao); ArvoreMinima.Imprime_Componentes_Conexos(Temas, Alunos); // Imprime Matriz ImprimeMatriz(Matriz); //Imprime_Grupo(Grupos_De_Orientacao, Temas, Alunos); Console.WriteLine("\nDigite qualquer tecla para voltar ao menu"); Console.ReadKey(); Console.Clear(); Opcao(); }