public override IEnumerable<string> Executar(Grafo grafo) { grafo.Direcionado = true; var retorno = new List<string>(); Dictionary<string, Vertice> Q = new Dictionary<string, Vertice>(); var primeiro = grafo.Vertices.First(); Q.Add(primeiro.Key, primeiro.Value); while (Q.Any()) { var U = Q.First(); Q.Remove(Q.Keys.First()); foreach (var vertice in grafo.GetAdj(U.Key)) { if (vertice.Value.Cor == CoresEnum.Branco) { vertice.Value.Descoberta = U.Value.Descoberta + 1; vertice.Value.Pai = U.Value; vertice.Value.Cor = CoresEnum.Cinza; Q.Add(vertice.Key, vertice.Value); } } retorno.Add(String.Format("{0} {1} {2}", grafo.Vertices.First().Key, U.Value.Id, U.Value.Descoberta)); U.Value.Cor = CoresEnum.Preto; } return retorno; }
public override IEnumerable<string> Executar(Grafo grafo) { var retorno = new List<string>(); grafo.Direcionado = true; initialize(grafo); var s = grafo.Vertices.First(); s.Value.Descoberta = 0; int i; for (i = 1; i < grafo.Vertices.Count -1; i++ ) { foreach(var aresta in grafo.Arestas) { relax(aresta.Origem, aresta.Destino, aresta.Peso); } } foreach (var ver in grafo.Vertices) { var saida = ver.Value.Descoberta.ToString(); while (ver.Value.Pai != null) { saida = ver.Value.Pai.Id + " " + saida; } if (saida.StartsWith(grafo.Vertices.First().Value.Id)) retorno.Add(saida); } return retorno; }
public override IEnumerable<string> Executar(Grafo grafo) { var retorno = new List<string>(); grafo.Direcionado = true; initialize(grafo); var s = grafo.Vertices.First(); s.Value.Descoberta = 0; Dictionary<string, Vertice> q = new Dictionary<string, Vertice>(); List<Vertice> w = new List<Vertice>(); q = grafo.Vertices; while (q.Any()) { q.OrderBy(e => e.Value.Descoberta).ToList(); var u = q.First(); q.Remove(q.Keys.First()); foreach (var vertice in grafo.GetAdj(u.Value.Id)) { var aresta = grafo.Arestas .Where(e => e.Origem.Equals(u.Key) && e.Destino.Equals(vertice.Key)) .FirstOrDefault(); relax(u.Value, vertice.Value, aresta.Peso); } if (u.Value.Descoberta != Int32.MaxValue) retorno.Add(String.Format("{0} {1} {2}", s.Value.Id, u.Value.Id, u.Value.Descoberta)); } return retorno; }
private void initialize(Grafo grafo) { foreach (var vertice in grafo.Vertices) { vertice.Value.Descoberta = Int32.MaxValue; vertice.Value.Pai = null; } }
public override IEnumerable<string> Executar(Grafo grafo) { grafoCorrente = grafo; dfs(grafo, false); var transposto = GrafoHelper.GetTransposto(grafo); dfs(transposto, true); return retorno; }
public void Executar(Grafo grafo) { this.grafo = grafo; tempo = 0; foreach (var item in (true ? grafo.Vertices : grafo.Vertices.OrderByDescending(e => e.Finalizacao).ToList())) { if (item.Cor == CoresEnum.Branco) dfsVisit(item); } }
public static Grafo GetTransposto(Grafo grafo) { var novaListaAresta = new List<Aresta>(); foreach (var aresta in grafo.Arestas) { if (grafo.Vertices[aresta.Origem].Adjacentes.ContainsKey(aresta.Destino)) grafo.Vertices[aresta.Origem].Adjacentes.Remove(aresta.Destino); if (grafo.Vertices[aresta.Destino].Adjacentes.ContainsKey(aresta.Origem)) grafo.Vertices[aresta.Destino].Adjacentes.Remove(aresta.Origem); grafo.Vertices[aresta.Destino].Adjacentes.Add(aresta.Origem, grafo.Vertices[aresta.Origem]); novaListaAresta.Add(new Aresta(aresta.Destino, aresta.Origem)); } grafo.Arestas = novaListaAresta; return grafo; }
private void dfs(Grafo grafo, bool decrescente) { foreach (var vertice in grafo.Vertices) { vertice.Value.Cor = CoresEnum.Branco; vertice.Value.Pai = null; } tempo = 0; foreach (var vertice in (!decrescente ? grafo.Vertices : grafo.Vertices.OrderByDescending(e => e.Value.Finalizacao).AsEnumerable())) { if (vertice.Value.Cor == CoresEnum.Branco) { componente = string.Empty; dfsVisit(vertice.Value); if (decrescente) retorno.Add(componente.Trim()); } } }
public static Grafo Ler(string caminhoArquivo) { var arquivo = File.ReadAllLines(caminhoArquivo); var retorno = new Grafo(); var primeiraParte = true; foreach (var linha in arquivo) { if (linha.Equals("#")) { primeiraParte = false; continue; } if (primeiraParte) { var vertice = new Vertice(linha); retorno.Vertices.Add(linha, vertice); } else { var carac = linha.Split(' '); var tamanho = carac.Length; if (tamanho <= 0 || tamanho > 3) throw new Exception("Não foi possível identificar especificações da aresta no arquivo de entrada"); if (tamanho >= 2) { var origem = retorno.Vertices[carac[0]]; var destino = retorno.Vertices[carac[1]]; origem.Adjacentes.Add(destino.Id, destino); var aresta = new Aresta(carac[0], carac[1]); if (tamanho > 2) aresta.Peso = Convert.ToInt16(carac[2]); retorno.Arestas.Add(aresta); } } } return retorno; }
public override IEnumerable<string> Executar(Grafo grafo) { throw new NotImplementedException(); }
public abstract IEnumerable<string> Executar(Grafo grafo);