예제 #1
0
        /*
         *  algoritmo de kruskal se baseia em guardar primeiro a aresta de menor custo.
         *  procurar pela proxima aresta de menor custo e gravar na arvore.
         */
        public Graph Kruskal(string name)
        {
            Graph       arvore                 = new Graph();
            Edge        arestaMenorCusto       = null;
            List <Edge> listaArestas           = new List <Edge>();
            List <Edge> listaMenorCustoArestas = new List <Edge>();
            List <Node> nosVisitados           = new List <Node>();

            foreach (Node n in this.nodes)
            {
                foreach (Edge e in n.Edges)
                {
                    listaArestas.Add(e);
                }
            }

            foreach (Node n in this.nodes)
            {
                arvore.AddNode(n.Name);
            }


            //ordena todas as arestas por ordem
            while (listaArestas.Count != 0)
            {
                arestaMenorCusto = listaArestas[0];
                foreach (Edge e in listaArestas)
                {
                    if (e.Cost <= arestaMenorCusto.Cost)
                    {
                        arestaMenorCusto = e;
                    }
                }
                listaMenorCustoArestas.Add(arestaMenorCusto);
                listaArestas.Remove(arestaMenorCusto);
            }

            //armazena nos dentro de uma lista para conferir
            nosVisitados.Add(listaMenorCustoArestas[0].From);
            foreach (Edge e in listaMenorCustoArestas)
            {
                //para cada no se ele ainda nao foi adicionado armazene na arvore
                if (!nosVisitados.Contains(e.To))
                {
                    nosVisitados.Add(e.To);
                    arvore.AddEdge(e.From.Name, e.To.Name, e.Cost);
                    arvore.AddEdge(e.To.Name, e.From.Name, e.Cost);
                }
            }

            return(arvore);
        }
예제 #2
0
        private bool Hamiltonian(Node n)
        {
            // Cria lista para armazenar o resultado..
            Queue <Node> queue = new Queue <Node>();
            // Arvore
            Graph arvore = new Graph();
            int   id     = 0;

            id++;
            arvore.AddNode(id.ToString(), n.Name);
            queue.Enqueue(arvore.Find(id.ToString()));

            // Realiza a busca..
            while (queue.Count > 0)
            {
                Node np          = queue.Dequeue();
                Node currentNode = this.Find(np.Info.ToString());
                if (this.nodes.Count == CountNodes(np))
                {
                    return(true);
                }

                foreach (Edge edge in currentNode.Edges)
                {
                    if (!ExistNode(np, edge.To.Name))
                    {
                        id++;
                        arvore.AddNode(id.ToString(), edge.To.Name);
                        Node nf = arvore.Find(id.ToString());
                        queue.Enqueue(nf);
                        arvore.AddEdge(nf.Name, np.Name, 1);
                    }
                }
            }

            return(false);
        }
예제 #3
0
        public Graph Kruskal(string name)
        {
            Graph       gTree = new Graph();
            List <Edge> eList = new List <Edge>();

            foreach (Node n in nodes)
            {
                gTree.AddNode(n.Name, n.Info);
                eList.AddRange(n.Edges);
            }

            eList = eList.OrderBy(c => c.Cost).ToList();

            foreach (Edge e in eList)
            {
                if (!ExistEdge(gTree.Find(e.To.Name), gTree))
                {
                    gTree.Find(e.From.Name).AddEdge(e.To, e.Cost);
                }
            }

            return(gTree);
        }
예제 #4
0
        /*
         * o algoritmo de prim pega um vertice aleatorio e através dele armazena-se a aresta com menor valor
         * sendo feito isso até o grafo novo estar com o mesmo tamanho
         */

        public Graph Prim(string name)
        {
            Graph arvore = new Graph();

            Random      rdn                    = new Random();
            List <Node> listaNos               = new List <Node>();
            List <Edge> listaArestas           = new List <Edge>();
            List <Edge> listaArestasMenorCusto = new List <Edge>();
            Edge        menorAresta            = null;
            int         contadorNos            = -1;
            double      cost                   = 0;

            //arvore.AddNode(no.Name);

            listaNos.Add(this.nodes[rdn.Next(this.nodes.Count)]);
            if (listaNos[0].Edges.Count > 0)
            {
                do
                {
                    //para cada aresta encontrada na lista dos nos armazenados
                    //guarda-se todas as arestas
                    foreach (Node n in listaNos)
                    {
                        foreach (Edge e in n.Edges)
                        {
                            if (!listaArestas.Contains(e))
                            {
                                listaArestas.Add(e);
                            }
                        }
                    }

                    menorAresta = null;
                    //pega aresta de maior valor na lista
                    foreach (Edge e in listaArestas)
                    {
                        if (cost < e.Cost)
                        {
                            cost = e.Cost;
                        }
                    }
                    //emcontra a aresta de menor custo
                    //armazena a aresta de menor custo na lista de aresta de menor custo

                    foreach (Edge e in listaArestas)
                    {
                        if (cost > e.Cost && !listaArestasMenorCusto.Contains(e) && !listaNos.Contains(e.To))
                        {
                            cost        = e.Cost;
                            menorAresta = e;
                        }
                    }
                    //se aresta for encontrada adiciona na lista de menor aresta

                    if (menorAresta != null)

                    {
                        listaNos.Add(menorAresta.To);

                        listaArestasMenorCusto.Add(menorAresta);

                        arvore.AddNode(menorAresta.From.Name);
                        arvore.AddNode(menorAresta.To.Name);
                        arvore.AddEdge(menorAresta.From.Name, menorAresta.To.Name, menorAresta.Cost);
                        arvore.AddEdge(menorAresta.To.Name, menorAresta.From.Name, menorAresta.Cost);
                    }

                    contadorNos++;
                } while (arvore.nodes.Count != contadorNos);
            }
            return(arvore);
        }