标签:
暴力枚举边的状态.....
2 3 3 1 2 2 3 3 1 4 4 1 2 2 3 3 4 4 1
0 2
/* *********************************************** Author :CKboss Created Time :2015年07月23日 星期四 12时45分03秒 File Name :1006.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> using namespace std; vector<int> G[10]; /// 1 0 int on[10],off[10]; int du[10]; int n,m; int color[10][10]; int ans; void init() { for(int i=0;i<=n;i++) { G[i].clear(); on[i]=off[i]=0; du[i]=0; } ans=0; memset(color,-1,sizeof(color)); } void dfs(int u) { if(u==n+1) { int fg=1; for(int i=1;i<=n&&fg;i++) { if(on[i]!=off[i]) fg=0; } ans+=fg; return ; } vector<int> vi; for(int i=0;i<du[u];i++) { int v=G[u][i]; if(color[u][v]!=-1) continue; vi.push_back(v); } int nt=vi.size(); for(int i=0;i<(1<<nt);i++) { for(int j=0;j<nt;j++) { int v=vi[j]; int cc=(i&(1<<j)); if(cc) cc=1; color[u][v]=cc; color[v][u]=cc; if(cc==0) { off[u]++; off[v]++; } else { on[u]++; on[v]++; } } if(on[u]==off[u]) dfs(u+1); /// uncolor for(int j=0;j<nt;j++) { int v=vi[j]; int cc=(i&(1<<j)); if(cc) cc=1; color[u][v]=-1; color[v][u]=-1; if(cc==0) { off[u]--; off[v]--; } else { on[u]--; on[v]--; } } } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T_T; scanf("%d",&T_T); while(T_T--) { scanf("%d%d",&n,&m); init(); for(int i=0,u,v;i<m;i++) { scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } bool flag=true; for(int i=1;i<=n&&flag;i++) { du[i]=G[i].size(); if(du[i]%2) flag=false; } if(flag) { dfs(1); printf("%d\n",ans); } else { printf("%d\n",0); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/ck_boss/article/details/47026765