自己做的时候一直想把这个无向图转化为有向图,然后就可以利用入度==出度来判断做题了,
然而根本不需要,用俩个数组分别记录,并让初始值都等于总度数的一半,然后进行搜索,如果可以搜索到最后
则这时所有点的俩个度数都为零,即offline等于online。记得思路不通的时候试着从反面想下
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<map>
#include<set>
#include<cmath>
#include<cstring>
using namespace std;
#define LL long long
int t,n,m,c1[10],c2[10],der[10];
struct edge
{
int u,v;
}e[100];
int ans;
void dfs(int cur)
{
if(cur==m+1)
{
ans++;
return;
}
int x=e[cur].u;
int y=e[cur].v;
if(c1[x]&&c1[y])
{
c1[x]--;
c1[y]--;
dfs(cur+1);
c1[x]++;
c1[y]++;
}
if(c2[x]&&c2[y])
{
c2[x]--;
c2[y]--;
dfs(cur+1);
c2[x]++;
c2[y]++;
}
return;
}
int main()
{
cin>>t;
while(t--)
{
memset(der,0,sizeof(der));
ans=0;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
e[i].u=x;
e[i].v=y;
der[x]++;
der[y]++;
}
int flag=0;
for(int i=1;i<=n;i++)
{
if(der[i]%2==1)
{
flag=1;
break;
}
c1[i]=der[i]/2;
c2[i]=der[i]/2;
}
if(flag)
{
cout<<0<<endl;
}
else
{
dfs(1);
cout<<ans<<endl;
}
}
return 0;
}