题意:相当于n个点,m条路,要给路赋值0或1,要求赋完后,每个点连接的路上,0,1的个数相同,求有几种赋值方式
思路:因为数据量太小,n《=8,所以直接暴力深搜就可以了,因为要求0,1个数相等,记得剪枝就可以了,不难
代码:
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
int n,m,T,aa,bb,num[10],x[10],y[10],ans,p[10];
struct AA
{
int l,r;
int ok;
bool operator<(const AA&aa)const{
if(l==aa.l) return r<aa.r;
return l<aa.l;
}
}pos[50];
int dfs(int rt)
{
int a,b;
if(rt==m+1) {
//cout<<"!!"<<endl;
for(int i=1;i<=n;i++)
{
if(x[i]!=y[i]) return 0;
}
ans++;return 0;}
a=pos[rt].l;
b=pos[rt].r;
// cout<<rt<<" "<<a<<" "<<b<<" "<<x[a]<<" "<<y[a]<<" "<<x[b]<<" "<<y[b]<<endl;
if((x[a]==p[a]||x[b]==p[b])&&(y[a]<p[a]&&y[b]<p[b]))
{
y[a]++;y[b]++;dfs(rt+1);y[a]--;y[b]--;
}
else if((x[a]<p[a]&&x[b]<p[b])&&(y[a]==p[a]||y[b]==p[b]))
{
x[a]++;x[b]++;dfs(rt+1);x[b]--;x[a]--;
}
else if(x[a]<p[a]&&y[a]<p[a]&&x[b]<p[b]&&y[b]<p[b])
{
x[a]++;
x[b]++;
dfs(rt+1);
x[a]--;
x[b]--;
y[a]++;
y[b]++;
dfs(rt+1);
y[a]--;
y[b]--;
}
return 0;
}
int main()
{
scanf("%d",&T);
while(T--)
{
ans=0;
scanf("%d%d",&n,&m);
memset(num,0,sizeof(num));
memset(x,0,sizeof(x));
for(int i=1;i<=m;i++)
{
scanf("%d%d",&aa,&bb);
pos[i].l=min(aa,bb);
pos[i].r=max(aa,bb);
num[aa]++;
num[bb]++;
}
for(int i=1;i<=n;i++)
{
if(num[i]%2)
{
ans=-1;break;
}
p[i]=num[i]/2;
}
if(ans==-1) printf("0\n");
else
{
sort(pos+1,pos+1+m);
dfs(1);
printf("%d\n",ans);
}
}
}