#include <vector>
#include <iostream>
#include <set>
using namespace std;
// struct Solver {
// int n;
// g
// n! --> (2^n * n) * (n + set)
// set<pair<int, vector<int>>> mem;
set<pair<int, int>> mem; // O(1)
// int mem[N][1 << N]; // O(1)
int bit(int x, int i) {
return (x >> i) & 1;
}
void go(int n, vector<vector<int>> &g, int v, int used, vector<int> &path) {
// used[v] = 1;
used ^= 1 << v;
path.push_back(v);
if ((int)path.size() == n) {
// =)
return;
}
if (mem.count({v, used}))
return;
mem.insert({v, used});
// <v, used>
for (int x : g[v])
if (bit(x, 0))
go(n, g, x, used, path);
path.pop_back();
// used[v] = 0;
used ^= 1 << v;
}
int main() {
int n;
// ...
vector<vector<int>> g(n);
// ...
vector<int> path;
// function<void(int, ...)> go = ...
for (int start = 0; start < n; start++)
go(n, g, start, 0, path);
}
|