private List <Vertice <string> > _minEncrucijadas(List <Vertice <string> > camino, Vertice <string> origen, Vertice <string> destino, bool[] visitados, List <Vertice <string> > mejorCamino) { camino.Add(origen); visitados[origen.getPosicion() - 1] = true; if (origen == destino) { //Console.WriteLine("\nLongitud camino actual: "+camino.Count); //Console.WriteLine("\nLongitud mejor camino: "+mejorCamino.Count); foreach (var vertice in camino) { Console.Write(vertice.getDato() + " "); } if (camino.Count < mejorCamino.Count) { //Console.WriteLine("\nHaciendo la copia."); mejorCamino.Clear(); mejorCamino.AddRange(camino); } return(camino); } else { foreach (var ady in origen.getAdyacentes()) { if (!visitados[ady.getDestino().getPosicion() - 1]) { this._minEncrucijadas(camino, ady.getDestino(), destino, visitados, mejorCamino); visitados[ady.getDestino().getPosicion() - 1] = false; camino.RemoveAt(camino.Count - 1); } } } return(null); }
private List<Vertice<int>> _caminoSimpleConDFS(List<Vertice<int>> camino, Vertice<int> origen, Vertice<int> destino, bool[] visitados) { camino.Add(origen); visitados[origen.getPosicion()-1] = true; if(origen == destino) { foreach (var vertice in camino) { Console.Write(vertice.getDato() + " "); } return camino; } else { foreach (var ady in origen.getAdyacentes()) { if(!visitados[ady.getDestino().getPosicion() - 1]) { this._caminoSimpleConDFS(camino,ady.getDestino(),destino,visitados); camino.RemoveAt(camino.Count-1); } } } return null; }
private void _DFS(Vertice <T> origen, bool[] visitados) { Console.Write(origen.getDato() + " "); visitados[origen.getPosicion() - 1] = true; foreach (var ady in origen.getAdyacentes()) { if (!visitados[ady.getDestino().getPosicion() - 1]) { this._DFS(ady.getDestino(), visitados); } } }
private void _ordenTopologico(Vertice <int> origen, bool[] visitados, Stack <Vertice <int> > pila) { //Console.Write(origen.getDato() + " "); visitados[origen.getPosicion() - 1] = true; foreach (var ady in origen.getAdyacentes()) { if (!visitados[ady.getDestino().getPosicion() - 1]) { this._ordenTopologico(ady.getDestino(), visitados, pila); } } pila.Push(origen); }
private List <Vertice <int> > _caminoMayor(List <Vertice <int> > camino, Vertice <int> origen, Vertice <int> destino, bool[] visitados, List <Vertice <int> > mejorCamino) { camino.Add(origen); visitados[origen.getPosicion() - 1] = true; if (origen == destino) { int tiempo = 0; for (int i = 0; i < camino.Count; i++) { tiempo += camino[i].getDato(); List <Arista <int> > adyacentes = camino[i].getAdyacentes(); for (int j = 0; j < adyacentes.Count; j++) { if (i != camino.Count - 1) { if (adyacentes[j].getDestino() == camino[i + 1]) { tiempo += adyacentes[j].getPeso(); } } } } if (camino.Count >= mejorCamino.Count && tiempo <= 120) //120 min = 2 hs { mejorCamino.Clear(); mejorCamino.AddRange(camino); } return(camino); } else { foreach (var ady in origen.getAdyacentes()) { if (!visitados[ady.getDestino().getPosicion() - 1]) { this._caminoMayor(camino, ady.getDestino(), destino, visitados, mejorCamino); visitados[ady.getDestino().getPosicion() - 1] = false; camino.RemoveAt(camino.Count - 1); } } } return(null); }
public void desConectar(Vertice <T> origen, Vertice <T> destino) { Arista <T> arista = origen.getAdyacentes().Find(a => a.getDestino().Equals(destino)); origen.getAdyacentes().Remove(arista); }
public void conectar(Vertice <T> origen, Vertice <T> destino, int peso) { origen.getAdyacentes().Add(new Arista <T>(destino, peso)); destino.aumentarGradoEntrada(); }