水水的DFS
题意:n个人m个关系,要求每个人的网上朋友和现实朋友一样多,求一共有多少种关系
解:因为数据小,暴力DFS就可以了,不过要一点小剪枝
#include <stdio.h> #include <string.h> int point[10]; struct aaa { int x,y; }line[30]; struct bbb { int online,outline; }node[10]; int sum; void dfs(int n,int m,int p) { if(p>m) { int flag=0; for(int i=1;i<=n;i++) { if(node[i].online!=node[i].outline||node[i].online!=point[i]) { flag=1; break; } } if(flag==0) sum++; return ; } int t=line[p].x,tt=line[p].y; for(int i=1;i<=2;i++) { if(i==1) { node[t].online++; node[tt].online++; if(node[t].online>point[t]||node[tt].online>point[tt]) { node[t].online--; node[tt].online--; continue; } } if(i==2) { node[t].outline++; node[tt].outline++; if(node[t].outline>point[t]||node[tt].outline>point[tt]) { node[t].outline--; node[tt].outline--; continue; } } dfs(n,m,p+1); if(i==1) { node[t].online--; node[tt].online--; } else { node[t].outline--; node[tt].outline--; } } return ; } int main() { int t,n,m; int x,y; while(scanf("%d",&t)!=-1) { while(t--) { memset(point,0,sizeof(point)); memset(line,0,sizeof(line)); memset(node,0,sizeof(node)); int flag=1; sum=0; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d",&line[i].x,&line[i].y); point[line[i].x]++; point[line[i].y]++; } if(n==m&&n%2!=0) //剪枝 { printf("0\n"); continue; } for(int i=1;i<=n;i++) //剪枝 { if(point[i]%2!=0) { printf("0\n"); flag=0; break; } point[i]/=2; } if(!flag) continue; dfs(n,m,1); printf("%d\n",sum); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-11 20:25:17