Example #1
0
        /*
         * Arvore Geradora Minimal de Prim
         * Retorna um grafo que representa a arvore de menor
         * caminho entre todos os vertices apartir de uma origem r
         */
        public static AdjacencyList <T> Prim(Graph <T> graph, T r)
        {
            //Obtem a lista de chaves do dicionario
            //Referencia direta aos vertices do grafo
            List <Vertex <T> > keys = graph.Vertices();

            //Para cada vertice do grafo
            foreach (Vertex <T> U in keys)
            {
                //Colocamos as variaveis internas do vertice em seus valores padrão
                U.key = float.PositiveInfinity;
                U.pi  = null;
            }
            //Encontramos o vertice R
            Vertex <T> R = keys.Find(x => x.value.Equals(r));

            //A chave de R vale 0
            R.key = 0;
            //Adicionamos a fila Q todos os vertices ordenados pela sua chave
            Queue <Vertex <T> > Q = new Queue <Vertex <T> >(keys.OrderBy(x => x.key));

            //Enquanto houver vertice em Q
            while (Q.Count != 0)
            {
                //Desenpilhamos U
                Vertex <T> U = Q.Dequeue();
                //Para cada aresta adjacente a U
                foreach (Edge <T> edge in graph.Adjacent(U))
                {
                    //Obtemos o vertice V de destino da aresta
                    Vertex <T> V = edge.to;
                    //Se V estiver em Q e seu peso de sua aresta for
                    //menor que sua chave
                    if (Q.Contains(V) && edge.weight < V.key)
                    {
                        //'pai' de V é U
                        V.pi = U;
                        //A chave de v e o peso da aresta
                        V.key = edge.weight;
                    }
                }
            }
            //Retornamos o grafo gerado apartir da lista de arestas seguras
            return(new AdjacencyList <T>(keys, graph.Edges().FindAll(x => (x.from.Equals(x.to.pi) || x.to.Equals(x.from.pi))), graph.CompareTo(), graph.isDirected));
        }
Example #2
0
        public static AdjacencyMatrix <T> Dijkstra(Graph <T> graph, T s)
        {
            Vertex <T> S = graph.Vertices().Find(x => x.value.Equals(s));

            InitializeSingleSource(graph, S);
            List <Vertex <T> > Q = graph.Vertices();
            List <Vertex <T> > R = new List <Vertex <T> >();

            while (Q.Count != 0)
            {
                Q = Q.OrderBy(x => x.distance).ToList();
                Vertex <T> U = Q[0];
                Q.Remove(U);
                R.Add(U);
                foreach (Edge <T> edge in graph.Adjacent(U))
                {
                    Relax(edge);
                }
            }

            return(new AdjacencyMatrix <T>(graph.Vertices(), graph.Edges().FindAll(x => (x.from.Equals(x.to.pi) || x.to.Equals(x.from.pi))), graph.CompareTo(), graph.isDirected));
        }