Guest User

Untitled

a guest
Feb 14th, 2016
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.48 KB | None | 0 0
  1. #include <list>
  2. #include <map>
  3. #include <set>
  4. #include <deque>
  5. #include <stack>
  6. #include <queue>
  7. #include <algorithm>
  8. #include <sstream>
  9. #include <iostream>
  10. #include <iomanip>
  11. #include <cstdio>
  12. #include <cmath>
  13. #include <cstdlib>
  14. #include <memory.h>
  15. #include <ctime>
  16. #include <bitset>
  17. #include <unordered_map>
  18.  
  19. using namespace std;
  20.  
  21. #define ABS(a) ((a>0)?a:-(a))
  22. #define MIN(a,b) ((a<b)?(a):(b))
  23. #define MAX(a,b) ((a<b)?(b):(a))
  24. #define FOR(i,a,n) for (int i=(a);i<(n);++i)
  25. #define FI(i,n) for (int i=0; i<(n); ++i)
  26. #define pnt pair <int, int>
  27. #define mp make_pair
  28. #define PI 3.1415926535897
  29. #define MEMS(a,b) memset(a,b,sizeof(a))
  30. #define LL long long
  31. #define U unsigned
  32.  
  33. int a[31][31];
  34. vector<int> b[2];
  35. int was[30];
  36. int n,m;
  37.  
  38. void dfs(int v, int who)
  39. {
  40.     if (was[v])
  41.         return;
  42.     was[v] = 1;
  43.     b[who].push_back(v);
  44.     FOR(i,0,n)
  45.         if (a[v][i])
  46.             dfs(i, who^1);
  47. }
  48.  
  49. int used[33];
  50. int premask[33];
  51.  
  52. int runs;
  53. int dp[(1<<15)+1][33];
  54. int wasdp[(1<<15)+1][33];
  55.  
  56. int r(int mask, int p)
  57. {
  58.     if (p == b[1].size())
  59.     {
  60.         return (mask + 1 == (1<<b[0].size()));
  61.     }
  62.     if (wasdp[mask][p] == runs)
  63.         return dp[mask][p];
  64.     wasdp[mask][p] = runs;
  65.     if (used[b[1][p]] == 0)
  66.         return dp[mask][p] = r(mask, p+1);
  67.     int res = r(mask, p+1) + r(mask|premask[b[1][p]], p+1);
  68.     return dp[mask][p] = res;
  69. }
  70.  
  71. int solve()
  72. {
  73.     FOR(i,0,b[1].size())
  74.     {
  75.         premask[b[1][i]] = 0;
  76.         FOR(j,0,b[0].size())
  77.             if (a[b[1][i]][b[0][j]])
  78.                 premask[b[1][i]]|=(1<<j);
  79.     }
  80.     int res = 0;
  81.     FOR(mask,0,(1<<b[0].size()))
  82.     {
  83.         MEMS(used, 0);
  84.         FOR(i,0,b[0].size())
  85.         {
  86.             if ((mask>>i)&1)
  87.                 FOR(j,0,n)
  88.                     if (a[b[0][i]][j])
  89.                         used[j] = 1;
  90.         }
  91.         int nmask = mask;
  92.         FOR(i,0,b[1].size())
  93.         {
  94.             if (used[b[1][i]] == 0)
  95.             {
  96.                 nmask|=premask[b[1][i]];
  97.             }
  98.         }
  99.         runs++;
  100.         res += r(nmask, 0);
  101.         //cout<<res<<endl;
  102.     }
  103.     return res;
  104. }
  105.  
  106. int main()
  107. {
  108. #ifdef Fcdkbear
  109.     freopen("in.txt", "r", stdin);
  110.     double beg = clock();
  111.     //freopen("out.txt", "w", stdout);
  112. #endif
  113.  
  114.     scanf("%d%d",&n,&m);
  115.     FOR(i,0,m)
  116.     {
  117.         int v1,v2;
  118.         cin>>v1>>v2;
  119.         v1--;
  120.         v2--;
  121.         a[v1][v2] = a[v2][v1] = 1;
  122.     }
  123.     int res = 1;
  124.     FOR(i,0,n)
  125.     {
  126.         if (was[i] == 0)
  127.         {
  128.             b[0].clear();
  129.             b[1].clear();
  130.             dfs(i,0);
  131.             if (b[0].size() > b[1].size())
  132.                 swap(b[0],b[1]);
  133.             if (b[1].size() == 0)
  134.                 continue;
  135.             res *= solve();
  136.         }
  137.     }
  138.     cout<<res<<endl;
  139.  
  140. #ifdef Fcdkbear
  141.     double end = clock();
  142.     fprintf(stderr, "*** Total time = %.3lf ***\n", (end - beg) / CLOCKS_PER_SEC);
  143. #endif
  144.     return 0;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment