Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
 private void initialize(Grafo grafo)
 {
     foreach (var vertice in grafo.Vertices)
     {
         vertice.Value.Descoberta = Int32.MaxValue;
         vertice.Value.Pai = null;
     }
 }
Ejemplo n.º 5
0
        public override IEnumerable<string> Executar(Grafo grafo)
        {
            grafoCorrente = grafo;
            dfs(grafo, false);
            var transposto = GrafoHelper.GetTransposto(grafo);
            dfs(transposto, true);

            return retorno;
        }
Ejemplo n.º 6
0
 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);
     }
 }
Ejemplo n.º 7
0
        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;
        }
Ejemplo n.º 8
0
 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());
         }
     }
 }
Ejemplo n.º 9
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.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;
        }
Ejemplo n.º 10
0
 public override IEnumerable<string> Executar(Grafo grafo)
 {
     throw new NotImplementedException();
 }
Ejemplo n.º 11
0
 public abstract IEnumerable<string> Executar(Grafo grafo);