标签:dfs
2 3 3 1 2 2 3 3 1 4 4 1 2 2 3 3 4 4 1
0 2
/* 题意:n个人,m个关系,每个人和别人的关喜有线上和线下,求每个人线上和线下的关系一样多的方案数 思路: dfs 先贴别人代码,跑的快 ,我的跑的慢 */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define eps 1e-8 using namespace std; typedef __int64 LL; #define N 100 int x[N],y[N],in[N],on[N],off[N]; int n,m; int ans; bool judge() { if(m&1) return false; for(int i=1;i<=n;i++) if(in[i]&1) return false; return true; } void dfs(int pos) { if(pos==m) { ans++; return ; } int u=x[pos],v=y[pos]; if(on[u]<in[u]/2&&on[v]<in[v]/2) //这个边为online 边 { on[u]++; on[v]++; dfs(pos+1); on[u]--; on[v]--; } if(off[u]<in[u]/2&&off[v]<in[v]/2) //这个边为off边 { off[u]++; off[v]++; dfs(pos+1); off[u]--; off[v]--; } } int main() { int i,j,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(in,0,sizeof(in)); memset(on,0,sizeof(on)); memset(off,0,sizeof(off)); for(i=0;i<m;i++) { scanf("%d%d",&x[i],&y[i]); in[x[i]]++; in[y[i]]++; } ans=0; if(!judge()) { printf("0\n"); continue; } dfs(0); printf("%d\n",ans); } return 0; }
/* 我的代码 */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define bug printf("hihi\n") #define eps 1e-8 typedef __int64 ll; using namespace std; #define INF 0x3f3f3f3f #define N 1<<8 __int64 ans; int on[N],down[N]; int n,m,f[N],in[N]; inline int get(int x) { int s=0; while(x) { s++; x&=(x-1); } return s; } inline bool judge(int pos,int cur) { int i; for(i=0;i<n;i++) if(on[i]&(1<<pos)&&!(cur&(1<<i))) return false; for(i=0;i<n;i++) if(down[i]&(1<<pos)&&(cur&(1<<i))) return false; return true; } void dfs(int pos) { if(pos==n) { ans++; return ; } int i,len=1<<n; for(i=0;i<len;i++) { if((f[pos]&i)!=i) continue; int tt=get(i); if(tt!=in[pos]/2) continue; if(!judge(pos,i)) continue; on[pos]=i; down[pos]=f[pos]^i; dfs(pos+1); on[pos]=0; down[pos]=0; } } int main() { int i,j,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); int u,v; memset(f,0,sizeof(f)); memset(on,0,sizeof(on)); memset(down,0,sizeof(down)); memset(in,0,sizeof(in)); bool flag=false; if(m&1) flag=true; while(m--) { scanf("%d%d",&u,&v); u--;v--; f[u]|=1<<v; f[v]|=1<<u; in[u]++; in[v]++; } for(i=0;i<n;i++) { if(in[i]&1) flag=true; } if(flag) { printf("0\n"); continue; } ans=0; int len=1<<n; for(i=0;i<len;i++) { if((f[0]&i)!=i) continue; int tt=get(i); if(tt!=in[0]/2) continue; on[0]=i; down[0]=f[0]^i; dfs(1); on[0]=0; down[0]=0; } printf("%I64d\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:dfs
原文地址:http://blog.csdn.net/u014737310/article/details/47028173