PICNIC (하, p. 155)

둘씩 짝 짓는 것을 모두 해보도록 완전탐색으로 푸는 문제
#include <bits/stdc++.h>
using namespace std;
bool chk[11];
bool f[11][11];
int n,m,ans;
void dfs(int x, int y, int fcnt) {
if(fcnt == n) {
ans++;
return;
}
for(int i=x+1; i<n-1; i++) {
for(int j=i+1; j<n; j++) {
if(!chk[i] && !chk[j] && f[i][j]) {
chk[i] = chk[j] = true;
dfs(i,j,fcnt+2);
chk[i] = chk[j] = false;
}
}
}
}
void init() {
memset(f, false, sizeof(f));
ans = 0;
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int tc; cin >> tc;
while(tc--) {
init();
cin >> n >> m;
for(int i=0; i<m; i++) {
int x,y; cin >> x >> y;
f[x][y] = f[y][x] = true;
}
for (int j = 1; j < n; j++) {
if (f[0][j]) {
chk[0] = chk[j] = true;
dfs(0, j, 2);
chk[0] = chk[j] = false;
}
}
printf("%d\n", ans);
}
return 0;
}