2 3 3 1 2 2 3 3 1 4 4 1 2 2 3 3 4 4 1
0 2
有 n
个人,m对
朋友关系,朋友之间可以选择成为 在线朋友 或者 离线朋友,每个人都想有相同数目的 在线朋友 和 离线朋友。(比如一个人有 x 个在线朋友,那么他必须有 x 个离线朋友)但是不同的人 x 可以不同。求有多少种方案可以满足他们的要求。
2
两个测试用例
3 3
三个人,三对朋友关系
1 2
1 2 是朋友,他们可以选择成为离线或者在线朋友
2 3
2 3 是朋友,他们可以选择成为离线或者在线朋友
3 1
3 4 是朋友,他们可以选择成为离线或者在线朋友
4 4
同理
1 2
2 3
3 4
4 1
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxm=100; int x[maxm]; int y[maxm]; int n,m; int ans; int vis1[maxm]; int vis2[maxm]; int sum[maxm]; void dfs(int pos) { if(pos==m+1) { int ok=1; for(int i=1; i<=n; i++) { if(vis1[i]!=vis2[i]) { ok=0; break; } } if(ok) { ans++; return; } } if(vis1[x[pos]]<(sum[x[pos]]>>1)&&vis1[y[pos]]<(sum[y[pos]]>>1)) { vis1[x[pos]]++; vis1[y[pos]]++; dfs(pos+1); vis1[x[pos]]--; vis1[y[pos]]--; } if(vis2[x[pos]]<(sum[x[pos]]>>1)&&vis2[y[pos]]<(sum[y[pos]]>>1)) { vis2[x[pos]]++; vis2[y[pos]]++; dfs(pos+1); vis2[x[pos]]--; vis2[y[pos]]--; } } int main() { int t; scanf("%d",&t); while(t--) { memset(sum,0,sizeof(sum)); memset(vis1,0,sizeof(vis1)); memset(vis2,0,sizeof(vis2)); scanf("%d%d",&n,&m); for(int i=1; i<=m; i++) { scanf("%d%d",&x[i],&y[i]); sum[x[i]]++; sum[y[i]]++; } int ok=1; for(int i=1; i<=n; i++) { if(sum[i]%2) { ok=0; printf("0\n"); break; } } if(ok) { ans=0; dfs(1); printf("%d\n",ans); } } return 0; }