private void Button2_Click(object sender, EventArgs e)//método de ação do botão criar Aresta { //verifica se os nós selecionado são iguais if ((No)comboBox1.SelectedItem != (No)comboBox2.SelectedItem) { //realiza pesquisa nas arestas existentes se já existe aresta com os mesmos nós Aresta ar1 = arestas.Find(x => (x.no1 == (No)comboBox1.SelectedItem) && (x.no2 == (No)comboBox2.SelectedItem)); Aresta ar2 = arestas.Find(x => (x.no2 == (No)comboBox1.SelectedItem) && (x.no1 == (No)comboBox2.SelectedItem)); //caso a pesquisa não retorne nada, prosseguir com a criação, caso contrário avisar o user if ((ar1 == null) && (ar2 == null)) { //cria a aresta com os dois nós selecionados arestas.Add(new Aresta((No)comboBox1.SelectedItem, (No)comboBox2.SelectedItem)); Atualizar(); } else { //exibe mensagem de erro e não cria a aresta MessageBox.Show("Aresta já existente, não é permitido a criação de arestas paralelas"); } } else { //exibe mensagem de erro e não cria a aresta MessageBox.Show("Não é permitido arestas do tipo laço (liga um nó a ele mesmo)"); } // }
public static void MenorPesoForaDaArvore() { Aresta arestaMenor = new Aresta(); arestaMenor.Peso = int.MaxValue; foreach (var vertice in VerticesArv) { foreach (var item in vertice.Arestas) { if (!VerticesArv.Contains(item.v1) || !VerticesArv.Contains(item.v2)) { if (!VerticesArv.Contains(item.v2)) { if (item.Peso < arestaMenor.Peso) { arestaMenor = item; } } } } } ArestasArv.Add(arestaMenor); if (arestaMenor.v1 != null && arestaMenor.v2 != null) { if (!VerticesArv.Contains(arestaMenor.v1) && arestaMenor.v1 != null) { VerticesArv.Add(arestaMenor.v1); } if (!VerticesArv.Contains(arestaMenor.v2) && arestaMenor.v2 != null) { VerticesArv.Add(arestaMenor.v2); } //Vertice v1 = VerticesArv.Find(x => x.Id == arestaMenor.v1.Id); //Vertice v2 = VerticesArv.Find(x => x.Id == arestaMenor.v2.Id); ////Adicionar para cada vértice o seu adjacente. //v1.VerticesAdj.Add(v2); //v2.VerticesAdj.Add(v1); } }
public static void IniciarArvore() { Vertice vertice = vertices[0]; vertice.VerticesAdj.Clear(); VerticesArv.Add(vertice); Aresta arestaMenor = new Aresta(); arestaMenor.Peso = int.MaxValue; foreach (var item in VerticesArv[0].Arestas) { if (item.Peso < arestaMenor.Peso) { arestaMenor = item; } } ArestasArv.Add(arestaMenor); if (arestaMenor.v1 != null && arestaMenor.v2 != null) { if (!VerticesArv.Contains(arestaMenor.v1) && arestaMenor.v1 != null) { VerticesArv.Add(arestaMenor.v1); } if (!VerticesArv.Contains(arestaMenor.v2) && arestaMenor.v2 != null) { VerticesArv.Add(arestaMenor.v2); } //Vertice v1 = VerticesArv.Find(x => x.Id == arestaMenor.v1.Id); //Vertice v2 = VerticesArv.Find(x => x.Id == arestaMenor.v2.Id); ////Adicionar para cada vértice o seu adjacente. //v1.VerticesAdj.Add(v2); //v2.VerticesAdj.Add(v1); } }
public static void CompCabeamento(Vertice v1, Vertice v2) { int count = 0; int maior = int.MinValue; for (int i = 0; i <= 5; i++) { int a = v2.Subconjunto.IndexOf(v1.Subconjunto[i], i); if (a != -1) { count++; } } Aresta aresta = new Aresta(); aresta.v1 = v1; aresta.v2 = v2; aresta.Peso = MenorSubconjunto(v1.Subconjunto, v2.Subconjunto, 0, 0); v1.Arestas.Add(aresta); v2.Arestas.Add(aresta); Arestas.Add(aresta); }
private void Colorir() //método que implementa o algoritmo de Welsh-Powell { List <No> nosOrdenados = new List <No>(nos); //cria uma cópia da lista de nós List <Color> cores = new List <Color>(); //cria lista de cores cores.Add(Color.Crimson); cores.Add(Color.Cyan); cores.Add(Color.LightGreen); cores.Add(Color.Yellow); cores.Add(Color.Fuchsia); cores.Add(Color.Brown); cores.Add(Color.Coral); cores.Add(Color.ForestGreen); cores.Add(Color.BlueViolet); cores.Add(Color.Lavender); cores.Add(Color.White); foreach (No no in nosOrdenados)//percorre a lista de nós { //calcula o grau de cada nó no.grau = arestas.FindAll(x => (x.no1 == no) || (x.no2 == no)).Count; no.c = Color.White;//retira qualquer cor existente nos nós } //ordena os nós em ordem descrescente de grau nosOrdenados.Sort((no1, no2) => no2.grau.CompareTo(no1.grau)); int indexcor = 0; //indice da cor atual No primeiroNoCor = null; //primeiro nó a receber a nova cor bool completo = false; //indicador de se os nós já foram totalmente coloridos bool interrompido = false; //indicador de que o algoritmo teve que ser interrompido while (!completo) { completo = true; primeiroNoCor = null; foreach (No no in nosOrdenados) { if (no.c == Color.White) //verifica se o nó tem alguma cor atribuída { if (primeiroNoCor == null) { no.c = cores[indexcor]; primeiroNoCor = no; } else {//verifica se o nó atual é adjacente a algum nó já colorido com a cor atual Aresta ar1 = arestas.Find(x => (x.no1 == no) && (x.no2.c == primeiroNoCor.c)); Aresta ar2 = arestas.Find(x => (x.no1.c == primeiroNoCor.c) && (x.no2 == no)); if ((ar1 == null) && (ar2 == null))//caso negativo, colore com a cor atual { no.c = cores[indexcor]; } else { completo = false;//um nó será deixado sem colorir, então ainda não terminará a execução } } } } if (indexcor < 10)//se ainda não tem 10 cores, troca para a próxima cor { indexcor++; } else//caso positivo, interrompe a coloração { indexcor = 10; completo = true; interrompido = true; } } Atualizar(); if (interrompido) { MessageBox.Show("Este grafo necessita de mais de 10 cores, o algoritmo foi interrompido"); } }