题意:有n(n<=8)个人,m对朋友,朋友关系分为线上朋友和线下朋友,要求每个人的线上朋友必须和线下朋友一样多,问可能的朋友关系数量。
思路:因为n的取值范围比较小,考虑暴力来做,用du数组记录每个人线上朋友减去线下朋友的差,那么只有当du全为0是ans加一。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#define eps 1e-6
#define LL long long
using namespace std;
const int maxn = 10;
const int INF = 0x3f3f3f3f;
int G[maxn][maxn], du[maxn];
int ans;
int n, m;
void dfs(int x, int y) {
if(x == n) {
if(!du[x]) ans++;
return;
}
else if(y > n) {
if(du[x]) return;
dfs(x+1, x+2);
}
else if(G[x][y]){
du[x]++; du[y]++;
dfs(x, y+1);
du[x] -= 2; du[y] -= 2;
dfs(x, y+1);
du[x]++; du[y]++;
}
else dfs(x, y+1);
}
int main() {
//freopen("input.txt", "r", stdin);
int t; cin >> t;
while(t--) {
memset(G, 0, sizeof(G));
ans = 0;
cin >> n >> m;
int u, v;
for(int i = 0; i < m; i++) {
cin >> u >> v;
G[u][v] = G[v][u] = 1;
}
dfs(1, 2);
cout << ans << endl;
}
return 0;
}