예제 #1
0
        /// <summary>
        /// Método para fazer busca em profundidade no grafo
        /// </summary>
        /// <param name="grafo">Grafo no qual sera feito a busca</param>
        /// <param name="vOrigem">vertice de origem</param>
        /// <param name="vDestino">vertice a ser encontrado no grafo</param>
        /// <returns>Resposta, contém um tirulo e o caminho percorrido no grafo até encontrar o destino</returns>
        public Resposta BuscaEmProfundidade(Grafo grafo, Vertice vOrigem, Vertice vDestino)
        {
            List<Vertice> visitados = new List<Vertice>();
            Stack<Vertice> fronteira = new Stack<Vertice>();
            Vertice vAtual = grafo.Vertices.First(x => x.Nome == vOrigem.Nome);
            Resposta resposta = new Resposta();
            Linha linhaResposta;
            string linha;

            try
            {
                if (vAtual != null)
                {
                    resposta.Titulo = String.Format("PROFUNDIDADE {0} {1}:", vOrigem.Nome, vDestino.Nome);
                    linhaResposta = new Linha { TextoLinha = vAtual.Nome };
                    resposta.Linhas.Add(linhaResposta);
                    while (true)
                    {
                        if (!(vAtual == vDestino))
                        {
                            foreach (var aresta in vAtual.ArestasSaindo.OrderByDescending(x => x.VerticeDestino.Nome))
                            {
                                fronteira.Push(aresta.VerticeDestino);
                            }

                            visitados.Add(vAtual);

                            //pega o proximo vertice não visitado na fronteira
                            for (int i = 0; i < fronteira.Count - 1; i++)
                            {
                                vAtual = fronteira.Peek();
                                if (visitados.Contains(vAtual))
                                {
                                    vAtual = fronteira.Pop();
                                    continue;
                                }
                                break;
                            }

                            linha = "";
                            foreach (var vertice in fronteira)
                            {
                                if (!visitados.Contains(vertice))
                                {
                                    linha += " " + vertice.Nome;
                                }
                            }
                            if (!string.IsNullOrEmpty(linha))
                            {
                                resposta.Linhas.Add(new Linha { TextoLinha = linha });
                            }
                        }
                        else
                        {
                            return resposta;
                        }
                    }
                }
                else
                {
                    return null;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
예제 #2
0
        /// <summary>
        /// Método para fazer a busca em largura
        /// </summary>
        /// <param name="grafo">Grafo no qual será feito a busca</param>
        /// <param name="vAtual">vertice de onde se inicia a busca</param>
        /// <param name="vDestino">vertice a ser encontrado no grafo</param>
        /// <returns>Resposta, contem um titulo e o caminho percorrido até encontrar o vertice</returns>
        public Resposta BuscaEmLargura(Grafo grafo, Vertice vOrigem, Vertice vDestino)
        {
            List<Vertice> fronteira = new List<Vertice>();
            List<Vertice> visitados = new List<Vertice>();
            Vertice vAtual = grafo.Vertices.First(x => x.Nome == vOrigem.Nome);
            Resposta resposta = new Resposta();
            Linha linhaResposta;
            string linha;

            try
            {
                resposta.Titulo = String.Format("LARGURA {0} {1}:", vOrigem.Nome, vDestino.Nome);
                linhaResposta = new Linha { TextoLinha = vAtual.Nome };
                resposta.Linhas.Add(linhaResposta);

                while (true)
                {
                    if (vAtual != null)
                    {
                        if (!(vAtual == vDestino))
                        {
                            //adiciona todos os destinos do vertice atual a fronteira
                            foreach (var aresta in vAtual.ArestasSaindo.OrderBy(x => x.VerticeDestino.Nome))
                            {
                                fronteira.Add(aresta.VerticeDestino);
                            }
                            //adiciona o vertice atual a lista de visitados
                            visitados.Add(vAtual);

                            //pega o proximo vertice não visitado na fronteira
                            for (int i = 0; i < fronteira.Count - 1; i++)
                            {
                                if (!visitados.Contains(fronteira[i]))
                                {
                                    vAtual = fronteira[i];
                                    break;
                                }
                                fronteira.Remove(fronteira[i]);
                            }

                            linha = "";
                            foreach (var vertice in fronteira)
                            {
                                if (!visitados.Contains(vertice))
                                {
                                    linha += " " + vertice.Nome;
                                }
                            }
                            resposta.Linhas.Add(new Linha { TextoLinha = linha });
                        }
                        else
                        {
                            return resposta;
                        }

                    }
                    else
                    {
                        return null;
                    }
                }
            }
            catch (Exception)
            {
                //Erro ao executar o algoritimo
                throw;
            }
        }