private List<Vertice> ExecutarEc(Grafo grafo) { var pilha = new Stack<Vertice>(); var retorno = new List<Vertice>(); var inicial = grafo.Vertices.First().Value; pilha.Push(inicial); while (pilha.Any()) { var u = pilha.Pop(); retorno.Insert(0, u); while (grafo.GetAdj(u.Id).Any()) { pilha.Push(u); var v = grafo.GetAdj(u.Id).First(); var tupla = new Tuple<Vertice, Vertice>(u, v); var arestas = grafo.ArestasDoVertice[tupla]; grafo.RemoveAresta(arestas); u = v; } } return retorno; }
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.AdicionaVertice(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]]; retorno.Adjacentes[origem.Id].Add(destino); retorno.Adjacentes[destino.Id].Add(origem); var aresta = new Aresta(origem, destino); if (tamanho > 2) aresta.Peso = Convert.ToInt16(carac[2]); retorno.AdicionaAresta(aresta); } } } return retorno; }