Skip to content

Instantly share code, notes, and snippets.

@barcahead
Created April 28, 2017 08:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save barcahead/4af4550e91a95cc05bc01f9a177bb832 to your computer and use it in GitHub Desktop.
Save barcahead/4af4550e91a95cc05bc01f9a177bb832 to your computer and use it in GitHub Desktop.
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <string>
#include <bitset>
#include <cstdio>
#include <limits>
#include <vector>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <numeric>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#include <tuple>
using namespace std;
class DFSCountEasy {
public:
long long f[9000][13];
bool visit[13];
void dfs(vector<string>& G, int k) {
visit[k] = 1;
for (int i=0; i<G.size(); i++) {
if (G[k][i] == 'Y' && !visit[i])
dfs(G, i);
}
}
long long solve(vector<string>& G, int mask, int cur) {
if (f[mask][cur] == -1) {
f[mask][cur] = 0;
for (int i=0; i<G.size(); i++) {
if (G[cur][i] == 'N' || (mask & (1<<i))) continue;
memset(visit, 0, sizeof(visit));
for (int j=0; j<G.size(); j++) {
if (mask & (1<<j)) visit[cur] = 1;
}
dfs(G, i);
int nmask = 0;
for (int j=0; j<G.size(); j++) {
if (visit[j]) nmask |= (1 << j);
}
f[mask][cur] += solve(G, mask|(1<<i), i) * solve(G, mask|nmask, cur);
}
f[mask][cur] = max(1LL, f[mask][cur]);
}
return f[mask][cur];
}
long long count(vector <string> G) {
memset(f, -1, sizeof(f));
int n = G.size();
long long ans = 0;
for (int i=0; i<n; i++) {
ans += solve(G, 1<<i, i);
cout<<solve(G, 1<<i, i)<<endl;
}
return ans;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment