예제 #1
0
        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;
        }
예제 #2
0
        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;
        }