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), ...
随机推荐
- BZOJ4477: [Jsoi2015]字符串树
[传送门:BZOJ4477] 简要题意: 给出一棵n个点的树,树上的边都代表一个字符串,给出Q个询问,每个询问输入x,y和字符串s,求出x到y的路径上以s为前缀的字符串个数 题解: 自己yy了一波可持 ...
- 一些 <link> 标记分享
<link rel="alternate" media="handheld" href="#" /> <link rel= ...
- canvas指定的宽高写在行间和写在style里面的区别?
上代码,指定的canvas宽高都一样,线条的粗细都是5px 1.宽:400:高:300:直接写在<canvas>里的效果: 2.删除<canvas>里的宽高,宽:400:高:3 ...
- Linux 设置交换分区
当需要添加swap分区时,可以使用如下方法:设置交换分区:1 以dd指令建立swapoff2 mkswap 来将swapfile 格式化为swap的档案格式.3 swapon 来启动该系统文件,使之成 ...
- Design Doc: Session History for Out-of-Process iframes
Design Doc: Session History for Out-of-Process iframes Charlie Reis, May 2014 This document outlines ...
- 记intel杯比赛中各种bug与debug【其二】:intel caffe的使用和大坑
放弃使用pytorch,学习caffe 本文仅记录个人观点,不免存在许多错误 Caffe 学习 caffe模型生成需要如下步骤 编写network.prototxt 编写solver.prototxt ...
- CF983E NN country(倍增,差分)
题意 给定一棵树和若干条路线,每条路线相当于树上 x,y 之间的路径,途径路径上的每个点 给出若干个询问,每次询问从 u 到 v 至少需要利用几条路线 N,M,Q≤200000 题解 构建倍增数组g[ ...
- 【模板】2-SAT 问题(2-SAT)
[模板]2-SAT 问题 题目背景 2-SAT 问题 模板 题目描述 有n个布尔变量 \(x_1\) ~ \(x_n\) ,另有m个需要满足的条件,每个条件的形式都是" \(x_i\) ...
- GenIcam标准(六)
2.9.可用的接口 本章用伪代码列出在2.3章介绍过的最重要的接口.对每个接口,实际的实现可以提供更多的方法,例如,除了SetValue(value)方法,还可以用直接映射到SetValue()的方式 ...
- 【Henu ACM Round#20 A】 Fancy Fence
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 看看有没有(n-2)*180/n等于输入的a就好. [代码] #include <bits/stdc++.h> usin ...