/* * 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)); }
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)); }