OIA-Politecnico

Caminos Eulerianos y Hamiltonianos

Camino Hamiltoniano

Encontrar un ciclo simple o camino simple que usa todos los vértices de un grafo simple conexo

Este problema es NP-Completo, por lo que no hay solución eficiente en el caso general.

Soluciones

Hay implementaciones mas eficientes. por ejemplo, fuerza bruta con next_permutation, o backtracking usando una permutacion global como estado.

Con esas ideas, se puede llegar a N=11 o N=12.

Camino Euleriano

Un ciclo o camino que usa todas las aristas de un grafo simple conexo

Aunque es re parecido al anterior, resulta que este problema sale en tiempo lineal!

Solución

Esta solución corre en tiempo lineal pero se puede hacer bastante más rápida usando std::list en vez de std::unordered_set.

unordered_set<int> g[maxn];
vector<int> camino;
void borrar_arista(int u, int v) {
	g[u].erase(v);
	g[v].erase(u); // solo si es no-dirigido
}
void dfs(int u) {
	while (!g[u].empty()) {
		int v = *begin(g[u]);
		borrar_arista(u, v);
		dfs(v);
	}
	camino.push_back(u);
}
vector<int> euleriano(int inicial) {
	camino.clear();
	dfs(u);
	reverse(begin(camino), end(camino));
	return camino;
}