hdu5305 Friends(dfs+map/hash)
题目: pid=5305">http://acm.hdu.edu.cn/showproblem.php?pid=5305
题意:给定N个人和M条朋友关系,是朋友关系的两个人之间有两种联系方式online和offline。使每一个人的online的数量和offline的数量相等,求方案数。
分析:因为M<=28,暴力枚举的话2^28非常大,会超时。能够考虑把全部的状态平分成两半,即枚举前面M/2条关系,暴力求出前面的2^(M/2)种状态,然后枚举后面M/2条关系,暴力求出后面2^(M/2)种状态,再枚举后面一半的状态,对于每一种状态直接在前面一半的状态里面找出满足条件的就可以。找状态用dfs比二进制枚举要快,查询的话map比hash方便。。。
代码:
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
int N,M,cnt[20],buf[20],f[20],ans,tp;
struct node
{
int a,b;
}e[200];
map <vector<int>,int> mp;
void dfs(int x,int y)
{
if(x>y)
{
if(tp==1)
mp[vector <int> (buf+1,buf+N+1)]++;
else
{
for(int i=1;i<=N;i++)
f[i]=(cnt[i]>>1)-buf[i];
if(mp.find(vector <int> (f+1,f+N+1))!=mp.end())
ans+=mp[vector <int> (f+1,f+N+1)];
}
return ;
}
buf[e[x].a]++;
buf[e[x].b]++;
if(buf[e[x].a]<=(cnt[e[x].a]>>1) && buf[e[x].b]<=(cnt[e[x].b]>>1))
dfs(x+1,y);
buf[e[x].a]--;
buf[e[x].b]--; dfs(x+1,y);
}
int main()
{
int ncase,i,j,z;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d%d",&N,&M);
mp.clear();
memset(cnt,0,sizeof(cnt));
ans=0;
for(i=1;i<=M;i++)
{
scanf("%d%d",&e[i].a,&e[i].b);
cnt[e[i].a]++;
cnt[e[i].b]++;
}
z=1;
for(i=1;i<=N;i++)
if(cnt[i]&1)
z=0;
if(!z)
{
printf("0\n");
continue ;
}
tp=1;
dfs(1,M/2);
tp=2;
dfs(M/2+1,M);
printf("%d\n",ans);
}
return 0;
}
另一种更简单的方法,直接dfs然后剪一下枝。假设一个人有x个朋友,那么暴力搜的过程中出现online的个数>x/2或者offline的个数>x/2就不满足条件也就不用搜了。
#include <iostream>
#include <cstdio>
using namespace std; int on[10],off[10],d[10],N,M,ans,x[30],y[30];
void dfs(int cur)
{
if(cur>M)
{
for(int i=1;i<=N;i++)
if(on[i]!=off[i])
return ;
++ans;
return ;
}
int u=x[cur],v=y[cur];
if(on[u]<d[u]/2 && on[v]<d[v]/2)
{
on[u]++;on[v]++;
dfs(cur+1);
on[u]--;on[v]--;
}
if(off[u]<d[u]/2 && off[v]<d[v]/2)
{
off[u]++;off[v]++;
dfs(cur+1);
off[u]--;off[v]--;
}
}
int main()
{
int ncase,i,j,k;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d%d",&N,&M);
memset(d,0,sizeof(d));
for(i=1;i<=M;i++)
{
scanf("%d%d",&x[i],&y[i]);
d[x[i]]++;
d[y[i]]++;
}
ans=0;
dfs(1);
printf("%d\n",ans);
}
return 0;
}
hdu5305 Friends(dfs+map/hash)的更多相关文章
- TTTTTTTTTTTT 百度之星D map+hash
Problem D Accepts: 2806 Submissions: 8458 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 6 ...
- Codeforces Round #267 (Div. 2)D(DFS+单词hash+简单DP)
D. Fedor and Essay time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞
3578: GTY的人类基因组计划2 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 367 Solved: 159[Submit][Status][ ...
- POJ 1840 Eqs 二分+map/hash
Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The co ...
- Hash Map (Hash Table)
Reference: Wiki PrincetonAlgorithm What is Hash Table Hash table (hash map) is a data structure use ...
- Wannafly挑战赛29-A御坂美琴 (dfs+map)
链接:https://ac.nowcoder.com/acm/contest/271/A来源:牛客网 御坂美琴 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言 ...
- [JSOI2017]原力(分块+map(hash))
题目描述 一个原力网络可以看成是一个可能存在重边但没有自环的无向图.每条边有一种属性和一个权值.属性可能是R.G.B三种当中的一种,代表这条边上 原力的类型.权值是一个正整数,代表这条边上的原力强度. ...
- hdu5305 Friends(dfs,多校题)
Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- bzoj 1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列——map+hash+转换
Description N(1<=N<=100000)头牛,一共K(1<=K<=30)种特色, 每头牛有多种特色,用二进制01表示它的特色ID.比如特色ID为13(1101), ...
随机推荐
- Pascal Script
MsgBox http://www.jrsoftware.org/ishelp/index.php?topic=isxfunc_msgbox ExpandConstant http://www.jrs ...
- 10.Intellij IDEA svn的使用详解
转自:https://www.2cto.com/kf/201703/614858.html 首先提一句,IDEA对各种的版本控制工具的支持是非常好的,打开系统设置界面,就可以看到他有专门的一栏 Ver ...
- rest_framework (版本)
请求进来 封装request. 版本限制 认证 权限 节流 版本 self.version_param url中版本的key self.default_version self.is_allowed_ ...
- BZOJ 1927 最小费用流问题
From lydrainbowcat //By SiriusRen #include <queue> #include <cstdio> #include <cstrin ...
- 洛谷P4180 [Beijing2010组队]次小生成树Tree
题目描述 小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等.正当小C洋洋得意之时,小P又来泼小C冷水了.小P说,让小C求出一个无向图的次小生成树,而且这个次小生成树还得 ...
- Android实现App版本自动更新
现在很多的App中都会有一个检查版本的功能.例如斗鱼TV App的设置界面下: 当我们点击检查更新的时候,就会向服务器发起版本检测的请求.一般的处理方式是:服务器返回的App版本与当前手机安装的版本号 ...
- python实现决策树C4.5算法(在ID3基础上改进)
一.概论 C4.5主要是在ID3的基础上改进,ID3选择(属性)树节点是选择信息增益值最大的属性作为节点.而C4.5引入了新概念"信息增益率",C4.5是选择信息增益率最大的属性作 ...
- SQL--去除字符串空格、截取字符串
1
- POJ 3630 Phone List(字典树)
题意 题意:t个case(1<=t<=40),给你n个电话号码(电话号码长度<10)(1 ≤ n ≤ 10000),如果有电话号码是另一个电话号码的前缀,则称这个通讯录是不相容的,判 ...
- Xwiki平台Windows搭建(Tomcat7 + XWiki6.2 + MySQL5.5)
背景介绍 国内xwiki安装使用资料较少,根据自己使用xwiki经验,总结出来,供参考,同时希望感兴趣的朋友能够一起讨论,XWiki是一个强大的Java开源的Wiki引擎. 它支持一些受欢迎的特性如: ...