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