*HDU 5305 - Friends (DFS + 剪枝)
来源:互联网 发布:学校宿舍网络设计 编辑:程序博客网 时间:2024/05/16 02:05
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=5305
题意:
n个人,m条边,每个人与他连边的人的关系有两种,两种关系的人数必须相同,求出方案数。
思路:
由于n<=8,m<=(8*7/2) = 28,因为每个人确定了1/2边之后剩下的边也就确定了,所有只要枚举 一半的边即可。
BFS,该边选或者不选。
AC.
#include <iostream>#include <cstdio>#include <vector>#include <cstring>using namespace std;int to[10], n, m, d[10], num;int u[100], v[100];int dfs(int x){ if(num*2 >= m) { for(int i = 1; i <= n; ++i) { if(d[i]*2 != to[i]) return 0; } return 1; } int ans = 0; if(d[u[x]]*2 < to[u[x]] && d[v[x]]*2 < to[v[x]]) { num++; d[u[x]]++; d[v[x]]++; ans += dfs(x+1); num--; d[u[x]]--; d[v[x]]--; } if(m/2 - num < m - x) ans += dfs(x+1); return ans;}int judge(){ for(int i = 1; i <= n; ++i) { if(to[i] % 2) return 0; } memset(d, 0, sizeof(d)); num = 0; return dfs(0);}int main(){ //freopen("in", "r", stdin); int T; scanf("%d", &T); while(T--) { memset(to, 0, sizeof(to)); scanf("%d%d", &n, &m); for(int i = 0; i < m; ++i) { scanf("%d %d", &u[i], &v[i]); to[u[i]] ++; to[v[i]] ++; } printf("%d\n", judge()); } return 0;}
0 0
- *HDU 5305 - Friends (DFS + 剪枝)
- HDU 5305 Friends DFS+剪枝
- HDU 5305 Friends(DFS + 剪枝)
- HDU 5305 Friends(2015多校第二场 dfs + 剪枝)
- HDU 5305 Friends (DFS)
- HDU 5305 Friends (DFS)
- hdu 5305 Friends (dfs)
- HDU 5305 Friends DFS
- hdu 5305 Friends dfs
- HDU 5305 Friends(DFS)
- HDU 5305 Friends(dfs)
- Friends(DFS+剪枝)
- hdu 5305 Friends(搜索+剪枝)
- HDU 5305 Friends(dfs)
- HDU 5305 Friends(dfs)
- hdu 5305 Friends(dfs)
- HDU 5305 Friends(简单DFS)
- hdu(5305)——Friends(dfs)
- 精通Hibernate——Hibernate核心接口
- iOS编程:学习篇(八)
- CSS 之float
- 股票学习(技术04)
- minisat 安装指南
- *HDU 5305 - Friends (DFS + 剪枝)
- Objective-C学习笔记(十七)——成员变量和属性详解
- SUSE Linux源码编译安装MySQL 5.6
- RPC框架研究(二)Hadoop源码-1
- HDU 4029 Distinct Sub-matrix 后缀数组 + Hash 2011年上海网络赛I题
- HDU 5294 Tricks Device 2015 Multi-University Training Contest 1 07
- PHP 安全编程建议
- CCF 窗口 Java实现
- Hard to Play