HDU 5305 Friends
2015-07-26 10:11
429 查看
水水的DFS
题意:n个人m个关系,要求每个人的网上朋友和现实朋友一样多,求一共有多少种关系
解:因为数据小,暴力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; }
相关文章推荐
- Asteroids - poj 3041(二分图最大匹配问题)
- Linux中TTY是什么意思
- 菜鸟初行---HelloWorld
- [C++学习笔记]--动态分配内存空间
- 北海道中文离线地图App上线
- 独木舟上的旅行
- 鼠标经过子元素触发mouseout,mouseover事件的解决方案
- Start cluster zookeeper in shell script
- TCP编程,Socket通讯
- linux C中调用shell命令和运行shell脚本
- 8,计时器应用实例
- poj 2886 Who Gets the Most Candies? (树状数组+二分+反素数)
- cf558c(bfs)
- http代理
- http压缩
- 国产龙芯新架构 CPU 正式发布
- 关于反射的总结——代码体现
- http缓存
- jQuery(二)
- 广岛中文离线地图App上线