Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <list>
- #include <map>
- #include <set>
- #include <deque>
- #include <stack>
- #include <queue>
- #include <algorithm>
- #include <sstream>
- #include <iostream>
- #include <iomanip>
- #include <cstdio>
- #include <cmath>
- #include <cstdlib>
- #include <memory.h>
- #include <ctime>
- #include <bitset>
- #include <unordered_map>
- using namespace std;
- #define ABS(a) ((a>0)?a:-(a))
- #define MIN(a,b) ((a<b)?(a):(b))
- #define MAX(a,b) ((a<b)?(b):(a))
- #define FOR(i,a,n) for (int i=(a);i<(n);++i)
- #define FI(i,n) for (int i=0; i<(n); ++i)
- #define pnt pair <int, int>
- #define mp make_pair
- #define PI 3.1415926535897
- #define MEMS(a,b) memset(a,b,sizeof(a))
- #define LL long long
- #define U unsigned
- int a[31][31];
- vector<int> b[2];
- int was[30];
- int n,m;
- void dfs(int v, int who)
- {
- if (was[v])
- return;
- was[v] = 1;
- b[who].push_back(v);
- FOR(i,0,n)
- if (a[v][i])
- dfs(i, who^1);
- }
- int used[33];
- int premask[33];
- int runs;
- int dp[(1<<15)+1][33];
- int wasdp[(1<<15)+1][33];
- int r(int mask, int p)
- {
- if (p == b[1].size())
- {
- return (mask + 1 == (1<<b[0].size()));
- }
- if (wasdp[mask][p] == runs)
- return dp[mask][p];
- wasdp[mask][p] = runs;
- if (used[b[1][p]] == 0)
- return dp[mask][p] = r(mask, p+1);
- int res = r(mask, p+1) + r(mask|premask[b[1][p]], p+1);
- return dp[mask][p] = res;
- }
- int solve()
- {
- FOR(i,0,b[1].size())
- {
- premask[b[1][i]] = 0;
- FOR(j,0,b[0].size())
- if (a[b[1][i]][b[0][j]])
- premask[b[1][i]]|=(1<<j);
- }
- int res = 0;
- FOR(mask,0,(1<<b[0].size()))
- {
- MEMS(used, 0);
- FOR(i,0,b[0].size())
- {
- if ((mask>>i)&1)
- FOR(j,0,n)
- if (a[b[0][i]][j])
- used[j] = 1;
- }
- int nmask = mask;
- FOR(i,0,b[1].size())
- {
- if (used[b[1][i]] == 0)
- {
- nmask|=premask[b[1][i]];
- }
- }
- runs++;
- res += r(nmask, 0);
- //cout<<res<<endl;
- }
- return res;
- }
- int main()
- {
- #ifdef Fcdkbear
- freopen("in.txt", "r", stdin);
- double beg = clock();
- //freopen("out.txt", "w", stdout);
- #endif
- scanf("%d%d",&n,&m);
- FOR(i,0,m)
- {
- int v1,v2;
- cin>>v1>>v2;
- v1--;
- v2--;
- a[v1][v2] = a[v2][v1] = 1;
- }
- int res = 1;
- FOR(i,0,n)
- {
- if (was[i] == 0)
- {
- b[0].clear();
- b[1].clear();
- dfs(i,0);
- if (b[0].size() > b[1].size())
- swap(b[0],b[1]);
- if (b[1].size() == 0)
- continue;
- res *= solve();
- }
- }
- cout<<res<<endl;
- #ifdef Fcdkbear
- double end = clock();
- fprintf(stderr, "*** Total time = %.3lf ***\n", (end - beg) / CLOCKS_PER_SEC);
- #endif
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment