2 3 3 1 2 2 3 3 1 4 4 1 2 2 3 3 4 4 1
02
这题是一道简单搜索题,我用dfs(idx,num1,num2)表示当前搜索的是idx的关系,num1表示虚拟关系的个数,num2表示现实关系的个数。
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; #define maxn 100060 #define ll long long int num[10],gra[10][10],n,m,sum,guanxi[10][10],vis1[10],vis2[10]; void dfs(int idx,int num1,int num2,int pos,int from) { int i,j; if(num1==num2 && num1+num2==num[idx]){ if(idx==n){ sum++;return; } else{ idx++;num1=num2=0; for(i=1;i<=n;i++){ if(guanxi[idx][i]==1){ num2++; } else if(guanxi[idx][i]==0){ num1++; } } dfs(idx,num1,num2,idx+1,0); } return ; } if(num1>num[idx]/2 || num2>num[idx]/2)return; for(i=pos;i<=n;i++){ if(gra[i][idx] && guanxi[i][idx]==-1){ guanxi[i][idx]=guanxi[idx][i]=0; dfs(idx,num1+1,num2,i+1,1); guanxi[i][idx]=guanxi[idx][i]=1; dfs(idx,num1,num2+1,i+1,2); guanxi[i][idx]=guanxi[idx][i]=-1;break; } } return; } int main() { int i,j,T,c,d,flag; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); if(n==1){ printf("1\n");continue; } memset(num,0,sizeof(num)); memset(gra,0,sizeof(gra)); for(i=1;i<=m;i++){ scanf("%d%d",&c,&d); gra[c][d]=gra[d][c]=1;num[c]++;num[d]++; } flag=1; for(i=1;i<=n;i++){ if(num[i]&1){ flag=0;break; } } if(!flag){ printf("0\n");continue; } sum=0; memset(guanxi,-1,sizeof(guanxi)); dfs(1,0,0,2,0); printf("%d\n",sum); } return 0; }