Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- int N, M;
- int g[20][20];
- vector<vector<long long>>dp(20, vector<long long>(1<<20, -1));
- long long solve(int node, int mask) {
- long long &ret = dp[node][mask];
- if(ret!=-1) return ret;
- ret = 0;
- int smallest = __builtin_ctz(mask);
- if(__builtin_popcount(mask)>2) ret += g[node][smallest];
- for(int to=smallest+1; to<N; ++to) if(~mask >> to & 1) {
- if(g[node][to]) ret += solve(to, mask|(1<<to));
- }
- return ret;
- }
- void PlayGround() {
- cin >> N >> M;
- for(int i=0; i<M; ++i) {
- int u, v; cin >> u >> v;
- --u, --v;
- g[u][v] = g[v][u] = 1;
- }
- long long ans = 0;
- for(int i=0; i<N; ++i) {
- ans += solve(i, (1<<i));
- }
- cout << ans/2 << '\n';
- // cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
- }
- int main() {
- PlayGround();
- return 0;
- }
Add Comment
Please, Sign In to add comment