Abrar_Al_Samit

A simple Task (CF) (Simple cycle counting)

Aug 7th, 2021 (edited)
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.91 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int N, M;
  5. int g[20][20];
  6. vector<vector<long long>>dp(20, vector<long long>(1<<20, -1));
  7. long long solve(int node, int mask) {
  8.     long long &ret = dp[node][mask];
  9.     if(ret!=-1) return ret;
  10.     ret = 0;
  11.     int smallest = __builtin_ctz(mask);
  12.     if(__builtin_popcount(mask)>2) ret += g[node][smallest];
  13.     for(int to=smallest+1; to<N; ++to) if(~mask >> to & 1) {
  14.         if(g[node][to]) ret += solve(to, mask|(1<<to));
  15.     }
  16.     return ret;
  17. }
  18. void PlayGround() {
  19.     cin >> N >> M;
  20.     for(int i=0; i<M; ++i) {
  21.         int u, v; cin >> u >> v;
  22.         --u, --v;
  23.         g[u][v] = g[v][u] = 1;
  24.     }
  25.     long long ans = 0;
  26.     for(int i=0; i<N; ++i) {
  27.         ans += solve(i, (1<<i));
  28.     }
  29.     cout << ans/2 << '\n';
  30.  
  31.  
  32.     // cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
  33. }
  34. int main() {
  35.  
  36.     PlayGround();
  37.     return 0;
  38. }
Add Comment
Please, Sign In to add comment