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), ...
随机推荐
- thinkphp5项目--个人博客(六)
thinkphp5项目--个人博客(六) 项目地址 fry404006308/personalBlog: personalBloghttps://github.com/fry404006308/per ...
- 设计url 通过分发的方式 Xadmin_demo
如 urlpatterns = [ url(r'^Xadmin/',([ url(r'^add/$', views.add) url(r'^delete/$', views.delete) ], No ...
- [poj 2480] Longge's problem 解题报告 (欧拉函数)
题目链接:http://poj.org/problem?id=2480 题目大意: 题解: 我一直很欣赏数学题完美的复杂度 #include<cstring> #include<al ...
- DefaultView 的作用(对DataSet查询出的来数据进行排序)
DefaultView 的作用 收藏 一直以来在对数据进行排序, 条件查询都是直接重复构建SQL来进行, 在查询次数和数据量不多的情况下倒没觉得什么, 但慢慢得, 当程序需要对大量数据椐不同条件 ...
- [HNOI2008]水平可见直线 单调栈
题目描述:在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:L1:y=x; L2:y=- ...
- Python学习笔记(4)--数据结构之元组tuple
元组(tuple) 定义:tuple和list十分相似,但是tuple是不可变的,即不能修改tuple 初始化:(), ('a', ) , ('a', 'b') //当只有一个元素时,需加上逗号, ...
- PatentTips - Managing sequenced lock requests
BACKGROUND In a multi-threaded processing environment, two or more threads may require access to a c ...
- 百度地图SDK for Android【Demo兴趣点搜索】
百度地图SDK为开发人员提供了便捷的检索服务. 今天我将为大家介绍Poi检索相关的内容. 首先,我们要构建一个最主要的地图应用.详细介绍请參考:百度地图SDK for Android[ ...
- Docker之基础篇
小白学Docker之基础篇 系列文章: 小白学Docker之基础篇 小白学Docker之Compose 小白学Docker之Swarm PS: 以下是个人作为新手小白学习docker的笔记总结 1 ...
- linux大于2T的磁盘使用GPT分区的方法分享
(parted)表示在parted中输入的命令,其他为自动打印的信息 1.首先类似fdisk一样,先选择要分区的硬盘,此处为/dev/sdb ey: parted /dev/sdb 2.选择了/dev ...