HDU 5305 Friends (DFS,穷举+剪枝)
题意:
给定n个人,m对朋友关系,如果对于每个人,只能刚好选择其所有朋友中的一半的人进行聊天(只是我和我的朋友,不是我的朋友和我的朋友),那么有多少种情况?只要一个选择不同,视为不同情况。
思路:
比如我在14个朋友中选择了7个跟我聊天,那么另外7人已经完全与我没干系,而和我聊天的7个朋友,也已经和我聊天了,即我们配对了,共7对,他所选择的那一半的人中也必须有我。
其实只考虑所给的m条边就行了。如果是奇数对关系,必定有人是奇数个朋友,那么也就0种情况。如果是偶数条边,还得判断每个人是否都是偶数个朋友,若不是也是0种。
满足了情况之后再对m个关系选取其中的m/2条即可。但是所选的关系也必须是满足要求的,那么对于所选的m/2条关系进行判断即可知道是否满足要求,穷举所有可能进行判断。DFS就可以了,每条边要么选,要么不选。但是必须剪枝才能过。
#include <bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
#define INF 0x7f7f7f7f
using namespace std;
const int N=;
int n, m, s[], e[], num, times[N], du[N];
int DFS(int x) //x是第几条边
{
if( num*>=m ) //已经够一半了,判断是否满足要求
{
for(int i=; i<=n; i++) if( *du[i]!= times[i] ) return ; //每个人的度有一半即可。
return ;
} int ans=;
if( du[ s[x] ]*<times[ s[x] ] && du[ e[x] ]* <times[e[x]] ) //剪枝:这条边两个端点都已经满度,就不能再选了。
{
du[s[x]]++,du[e[x]]++;
num++; //所选边的数量
ans+=DFS(x+);
du[s[x]]--,du[e[x]]--;
num--;
} if( m/-num < m-x ) //还没有决定是否选的边数必须不小于m的一半
ans+=DFS(x+);
return ans;
} int cal(int n )
{
//先检查是否满足奇数度的要求
if(m&) return ;
for(int i=; i<=n; i++) if( times[i]& ) return ; num=;
memset(du,,sizeof(du));
return DFS();
} int main()
{
//freopen("e://input.txt", "r", stdin);
int t;
cin>>t;
while(t--)
{
memset(times, , sizeof(times));
scanf( "%d%d",&n,&m );
for(int i=; i<m; i++)
{
scanf("%d%d",&s[i],&e[i]);
times[s[i] ]++; //记录朋友个数
times[e[i] ]++;
}
printf("%d\n",cal(n));
}
return ;
}
AC代码
HDU 5305 Friends (DFS,穷举+剪枝)的更多相关文章
- HDU 5305 Friends dfs
Friends 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5305 Description There are n people and m pa ...
- 比赛安排(穷举法或dfs)
比赛安排 时间限制: 1 Sec 内存限制: 125 MB提交: 11 解决: 10[提交][状态][讨论版][命题人:外部导入] 题目描述 设有2n(n<=6)个球队进行单循环比赛,计划在 ...
- hdu 1044(bfs+dfs+剪枝)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- HDU 1017 A Mathematical Curiosity (输出格式,穷举)
#include<stdio.h> int main() { int N; int n,m; int a,b; int cas; scanf("%d",&N); ...
- HDU 1017 A Mathematical Curiosity【看懂题意+穷举法】
//2014.10.17 01:19 //题意: //先输入一个数N,然后分块输入,每块输入每次2个数,n,m,直到n,m同一时候为零时 //结束,当a和b满足题目要求时那么这对a和b就是一组 ...
- AOJ 0525 穷举
题意:有一个烤饼器可以烤r行c列的煎饼,煎饼可以正面朝上(用1表示)也可以背面朝上(用0表示).一次可将同一行或同一列的煎饼全部翻转.现在需要把尽可能多的煎饼翻成正面朝上,问最多能使多少煎饼正面朝上? ...
- [C++11][算法][穷举]输出背包问题的所有可满足解
关于背包问题的题目,前人之述备矣,这里只讨论实现 输入: n ca w_1 v_1 w_2 v_2 ... w_n v_n 其中,n是物品总数,ca是背包大小,w_n是第n个物品的重量,v_n是第n个 ...
- C#穷举
穷举: 穷举法的基本思想是根据题目的部分条件确定答案的大致范围, 并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕.若某个情况验证符合题目的全部条件,则为本问题的一个解:若全部情况验证后都 ...
- C#语句2——循环语句(for穷举、迭代和while循环)
一.for循环拥有两类: (一).穷举: 把所有可能的情况都走一遍,使用if条件筛选出来满足条件的情况. 1.单位给发了一张150元购物卡,拿着到超市买三类洗化用品.洗发水15元,香皂2元,牙刷5元. ...
随机推荐
- org.hibernate.service.classloading.spi.ClassLoadingException: Specified JDBC Driver com.mysql.jdbc.Driver class not found
今天在使用hibernate搭建开发环境的时候出现了一个不可思议的问题: org.hibernate.service.classloading.spi.ClassLoadingException: S ...
- 【BZOJ】【1026】【SCOI2009】Windy数
数位DP cxlove基础数位DP第三题 = =预处理是个很有用的东西!然后就是分类讨论! /***************************************************** ...
- 使用了非标准扩展:“xxx”使用 SEH,并且“xxx”有析构函数
如果一个函数内使用了异常处理机制, VC 编译器在编译该函数时,它会给此函数插入一些“代码和信息”(代码指的是当该函数中出现异常时的回调函数,而信息主要是指与异常出现相关的一些必要的链表),因此每份函 ...
- RAD项目结构
- C/C++框架和库
http://blog.csdn.net/xiaoxiaoyeyaya/article/details/42541419 值得学习的C语言开源项目 - 1. Webbench Webbench是一个在 ...
- 【redis】03list类型
list类型 redis的list类型是一个链表结构,他的主要功能是push.pop.获取一个范围的所有值等等一些操作, 咱们push什么意思,push是不是相当于咱们php里面的array_push ...
- zoj 2974 Just Pour the Water (矩阵快速幂,简单)
题目 对于案例的解释请见下图: 这道要变动提取一下矩阵,之后就简单了 具体解释可看代码: #include <string.h> #include <stdio.h> #inc ...
- go语言入门
Go语言最主要的特性: 自动垃圾回收 更丰富的内置类型 函数多返回值 错误处理 匿名函数和闭包 类型和接口 并发编程 反射 语言交互性 1.2.4 错误处理Go语言引入了3个关键字用 ...
- 【转】Windows Server 2008修改远程桌面连接数
按照下面的设置是成功了的,我设置的连接数是5个. http://jingyan.baidu.com/article/154b463150d1b128ca8f4194.html
- Servlet编写登录界面
package com.mhb; import java.io.IOException;import java.io.PrintWriter; import javax.servlet.Servlet ...