题目:

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)的更多相关文章

  1. TTTTTTTTTTTT 百度之星D map+hash

    Problem D  Accepts: 2806  Submissions: 8458  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 6 ...

  2. 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 ...

  3. 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞

    3578: GTY的人类基因组计划2 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 159[Submit][Status][ ...

  4. POJ 1840 Eqs 二分+map/hash

    Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The co ...

  5. Hash Map (Hash Table)

    Reference: Wiki  PrincetonAlgorithm What is Hash Table Hash table (hash map) is a data structure use ...

  6. Wannafly挑战赛29-A御坂美琴 (dfs+map)

    链接:https://ac.nowcoder.com/acm/contest/271/A来源:牛客网 御坂美琴 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言 ...

  7. [JSOI2017]原力(分块+map(hash))

    题目描述 一个原力网络可以看成是一个可能存在重边但没有自环的无向图.每条边有一种属性和一个权值.属性可能是R.G.B三种当中的一种,代表这条边上 原力的类型.权值是一个正整数,代表这条边上的原力强度. ...

  8. hdu5305 Friends(dfs,多校题)

    Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  9. bzoj 1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列——map+hash+转换

    Description N(1<=N<=100000)头牛,一共K(1<=K<=30)种特色, 每头牛有多种特色,用二进制01表示它的特色ID.比如特色ID为13(1101), ...

随机推荐

  1. numeric and int in sql server

    类型映射 https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-data-type-mappings C#关 ...

  2. OLTP 与 OLAP

    OLTP:On-Line Transaction Processing(联机事务处理过程).也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出 ...

  3. Asp.Net中使用水晶报表(下)

    Asp.Net中使用水晶报表(下)   使用PUSH模式 我们采用下面的几步使用Push模式执行水晶报表: 1. 设计一个DataSet 2. 创建一个.rpt文件同时将其指定给上一步建立的DataS ...

  4. vue子组件使用指令 同时绑定v-model 指令没有作用

    //这里直接上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  5. vue2.0 兄弟组件数据传递方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 解决高版本vm打开虚拟机报错

    问题: 打开虚拟机的文件目录,找到.vmx 文件 用记事本打开重命名后的“.vmx.txt”文件 找到行:policy.vm.mvmtid = "52 10 08 ed ff 34 ed d ...

  7. JS由Number与new Number的区别引发的思考

    在回答园子问题的时候发现了不少新东西,写下来分享一下 == 下面的图就是此篇的概览,另外文章的解释不包括ES6新增的Symbol,话说这货有包装类型,但是不能new... 基于JS是面向对象的,所以我 ...

  8. TCP服务器如何区分不同的用户

    CS架构:使用SOCKET(一般是一个整数),当服务器侦听到连接请求的时候,accept会返回一个SOCKET(用于识别不同的连接,可以理解成,SOCKET是区分不同连接的ID).当服务器listen ...

  9. [POI2009]KON-Ticket Inspector(二维前缀和+DP)

    题意 有n个车站,现在有一辆火车从1到n驶过,给出aij代表从i站上车j站下车的人的个数.列车行驶过程中你有K次检票机会,所有当前在车上的人会被检票,问最多能检多少个不同的人的票 (n<=600 ...

  10. struts2登录后返回登录前的页面

    在Action中添加 String getUrl() { return ServletActionContext.getRequest().getHeader("referer") ...