http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1017&ojid=0&cid=12578&hide=0
题意:问有几种方案使得每个人的朋友在线和离线的一样多。所以朋友个数是奇数个直接pass掉,偶数的时候深搜判断,注意离线和在线是标在边上的,不然样例二不会是2个。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,on[15],off[15],sum[15],flag,pa[35],pb[35],x,y,ans,n,m;
bool judge()
{
for(int i=1;i<=n;i++)
{
if(on[i]!=off[i])
return 0;
}
return 1;
}
void dfs(int cnt)
{
if(cnt==m+1)
{
if(judge())
ans++;
return ;
}
int x=pa[cnt];
int y=pb[cnt];
if(on[x]<sum[x]/2&&on[y]<sum[y]/2)
{
on[x]++;
on[y]++;
cnt++;
dfs(cnt);
on[x]--;
on[y]--;
cnt--;
}
if(off[x]<sum[x]/2&&off[y]<sum[y]/2)
{
off[x]++;
off[y]++;
cnt++;
dfs(cnt);
off[x]--;
off[y]--;
cnt--;
}
}
int main()
{
int i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(sum,0,sizeof(sum));
memset(on,0,sizeof(on));
memset(off,0,sizeof(off));
for(i=1;i<=m;i++)
{
scanf("%d%d",&pa[i],&pb[i]);
sum[pa[i]]++;
sum[pb[i]]++;
}
flag=0;
for(i=1;i<=n;i++)
{
if(sum[i]%2)
{
flag=1;
break;
}
}
if(flag)
printf("0\n");
else
{
ans=0;
dfs(1);
printf("%d\n",ans);
}
}
}