import java.util.ArrayList;
import java.util.LinkedList;
public class Grafo {
private int vertices;
private ArrayList<LinkedList<Integer>> listaAdyacencia;
public Grafo(int vertices) {
this.vertices = vertices;
this.listaAdyacencia = new ArrayList<>(vertices);
for (int i = 0; i < vertices; i++) {
listaAdyacencia.add(new LinkedList<>());
}
}
public void agregarArista(int origen, int destino) {
listaAdyacencia.get(origen).add(destino);
listaAdyacencia.get(destino).add(origen);
}
public void encontrarPaths(int origen, int destino, int k) {
boolean[] visitado = new boolean[vertices];
ArrayList<Integer> path = new ArrayList<>();
path.add(origen);
encontrarPathsUtil(origen, destino, k, visitado, path);
}
private void encontrarPathsUtil(int actual, int destino, int k, boolean[] visitado, ArrayList<Integer> path) {
visitado[actual] = true;
if (actual == destino && path.size() == k + 1) {
System.out.println(path);
}
if (path.size() <= k) {
for (int vecino : listaAdyacencia.get(actual)) {
if (!visitado[vecino]) {
path.add(vecino);
encontrarPathsUtil(vecino, destino, k, visitado, path);
path.remove(path.size() - 1);
}
}
}
visitado[actual] = false;
}
public void encontrarWalks(int origen, int destino, int k) {
boolean[] visitado = new boolean[vertices];
ArrayList<Integer> path = new ArrayList<>();
path.add(origen);
encontrarWalksUtil(origen, destino, k, visitado, path);
}
private void encontrarWalksUtil(int actual, int destino, int k, boolean[] visitado, ArrayList<Integer> path) {
visitado[actual] = true;
if (path.size() == k + 1) {
System.out.println(path);
}
if (path.size() <= k) {
for (int vecino : listaAdyacencia.get(actual)) {
if (!visitado[vecino]) {
path.add(vecino);
encontrarWalksUtil(vecino, destino, k, visitado, path);
path.remove(path.size() - 1);
}
}
}
visitado[actual] = false;
}
public static void main(String[] args) {
Grafo grafo = new Grafo(4);
grafo.agregarArista(0, 1);
grafo.agregarArista(0, 2);
grafo.agregarArista(1, 2);
grafo.agregarArista(2, 0);
grafo.agregarArista(2, 3);
grafo.agregarArista(3, 3);
System.out.println("Paths de longitud 2:");
grafo.encontrarPaths(0, 2, 2);
System.out.println("\nWalks de longitud 2:");
grafo.encontrarWalks(0, 2, 2);
}
}