/// <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; } }
/// <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; } }