Mam sobie kod:
void hamilton_cycle(Graph::size_type v, Graph &graph, std::vector<bool>& visited, std::queue<Graph::size_type> &q) {
q.push(v);
if (q.size() != graph.nodes_count()) {
visited[v] = true;
for(auto& n : graph.neighbours(v))
if (visited[n] == false)
hamilton_cycle(n, graph, visited, q);
visited[v] = false;
q.pop();
}
}
bool hamilton_cycle(Graph &graph) {
std::queue<Graph::size_type> q;
std::vector<bool> visited(graph.nodes_count());
hamilton_cycle(0, graph, visited, q);
return graph.is_edge(q.back(), 0);
}
void generate_graph(Graph &graph, double denecity = 0.5, bool with_cycle = true) {
int size = graph.nodes_count();
int vertices = floor((size * (size - 1)) * denecity);
if (with_cycle) {
int i = 0;
std::vector<Graph::size_type> cycle(size);
std::generate(cycle.begin(), cycle.end(), [&]() { return i++; });
std::random_shuffle(cycle.begin(), cycle.end());
graph.add_edge(cycle[0], cycle.back());
for (auto i = 1; i < cycle.size(); i++) {
graph.add_edge(cycle[i-1], cycle[i]);
}
vertices -= cycle.size();
}
while (graph.edges_count() < vertices) {
int a = 0, b = 0;
do { a = rand() % size; b = rand() % size; } while (a == b);
graph.add_edge(a, b);
}
}
Mający w założeniu generować graf z cyklem Hamiltona (i to robi, przynjamniej dla danych jakie podałem), ale to czy znajdzie cykl czy nie już wygląda od widzimisię programu. Z debuggera nie za bardzo udało mi się cokolwiek wywnioskować, więc już zaczyna mi brakować pomysłów co tu może być źle. Ma ktoś jakiś pomysł?