HDU 5305 Friends(dfs)
Friends
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 297 Accepted Submission(s): 127
and m pairs
of friends. For every pair of friends, they can choose to become online friends (communicating using online applications) or offline friends (mostly using face-to-face communication). However, everyone in these n people
wants to have the same number of online and offline friends (i.e. If one person has x onine
friends, he or she must have x offline
friends too, but different people can have different number of online or offline friends). Please determine how many ways there are to satisfy their requirements.
indicating the number of testcases.
For each testcase, the first line contains two integers n (1≤n≤8) and m (0≤m≤n(n−1)2),
indicating the number of people and the number of pairs of friends, respectively. Each of the next m lines
contains two numbers x and y,
which mean x and y are
friends. It is guaranteed that x≠y and
every friend relationship will appear at most once.
2
3 3
1 2
2 3
3 1
4 4
1 2
2 3
3 4
4 1
0
2
/* 题意:n个人,m个关系。每一个人和别人的关喜有线上和线下,求每一个人线上和线下的关系一样多的方案数
思路: dfs
先贴别人代码,跑的快
,我的跑的慢 */ #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map> #define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1) #define eps 1e-8
using namespace std; typedef __int64 LL; #define N 100 int x[N],y[N],in[N],on[N],off[N];
int n,m;
int ans; bool judge()
{
if(m&1) return false;
for(int i=1;i<=n;i++) if(in[i]&1) return false;
return true;
} void dfs(int pos)
{
if(pos==m)
{
ans++;
return ;
}
int u=x[pos],v=y[pos];
if(on[u]<in[u]/2&&on[v]<in[v]/2) //这个边为online 边
{
on[u]++;
on[v]++;
dfs(pos+1);
on[u]--;
on[v]--;
} if(off[u]<in[u]/2&&off[v]<in[v]/2) //这个边为off边
{
off[u]++;
off[v]++;
dfs(pos+1);
off[u]--;
off[v]--;
}
}
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(in,0,sizeof(in));
memset(on,0,sizeof(on));
memset(off,0,sizeof(off)); for(i=0;i<m;i++)
{
scanf("%d%d",&x[i],&y[i]);
in[x[i]]++;
in[y[i]]++;
}
ans=0;
if(!judge())
{
printf("0\n");
continue;
}
dfs(0);
printf("%d\n",ans);
}
return 0;
}
/*
我的代码
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map> #define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1) #define bug printf("hihi\n") #define eps 1e-8
typedef __int64 ll; using namespace std; #define INF 0x3f3f3f3f #define N 1<<8 __int64 ans; int on[N],down[N];
int n,m,f[N],in[N]; inline int get(int x)
{
int s=0;
while(x)
{
s++;
x&=(x-1);
}
return s;
} inline bool judge(int pos,int cur)
{
int i;
for(i=0;i<n;i++)
if(on[i]&(1<<pos)&&!(cur&(1<<i))) return false; for(i=0;i<n;i++)
if(down[i]&(1<<pos)&&(cur&(1<<i))) return false;
return true;
} void dfs(int pos)
{
if(pos==n)
{
ans++;
return ;
}
int i,len=1<<n;
for(i=0;i<len;i++)
{
if((f[pos]&i)!=i) continue;
int tt=get(i);
if(tt!=in[pos]/2) continue;
if(!judge(pos,i)) continue;
on[pos]=i;
down[pos]=f[pos]^i;
dfs(pos+1);
on[pos]=0;
down[pos]=0;
}
} int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
int u,v;
memset(f,0,sizeof(f));
memset(on,0,sizeof(on));
memset(down,0,sizeof(down));
memset(in,0,sizeof(in));
bool flag=false;
if(m&1) flag=true;
while(m--)
{
scanf("%d%d",&u,&v);
u--;v--;
f[u]|=1<<v;
f[v]|=1<<u;
in[u]++;
in[v]++;
} for(i=0;i<n;i++)
{
if(in[i]&1) flag=true;
}
if(flag)
{
printf("0\n");
continue;
}
ans=0;
int len=1<<n;
for(i=0;i<len;i++)
{
if((f[0]&i)!=i) continue;
int tt=get(i);
if(tt!=in[0]/2) continue;
on[0]=i;
down[0]=f[0]^i;
dfs(1);
on[0]=0;
down[0]=0;
}
printf("%I64d\n",ans);
}
return 0;
}
HDU 5305 Friends(dfs)的更多相关文章
- HDU 5965 扫雷(dfs)题解
题意:给你一个3*n的格子,中间那行表明的是周围8格(当然左右都没有)的炸弹数量,上下两行都可以放炸弹,问你有几种可能,对mod取模 思路:显然(不),当i - 1和i - 2确定时,那么i的个数一定 ...
- HDU 1518 Square(DFS)
Problem Description Given a set of sticks of various lengths, is it possible to join them end-to-end ...
- HDU 1015 Safecracker (DFS)
题意:给一个数字n(n<=12000000)和一个字符串s(s<=17),字符串的全是有大写字母组成,字母的大小按照字母表的顺序,比如(A=1,B=2,......Z=26),从该字符串中 ...
- Hdu 1175 连连看(DFS)
Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175 因为题目只问能不能搜到,没问最少要几个弯才能搜到,所以我采取了DFS. 因为与Hdu ...
- hdu 2821 Pusher (dfs)
把这个写出来是不是就意味着把 http://www.hacker.org/push 这个游戏打爆了? ~啊哈哈哈 其实只要找到一个就可以退出了 所以效率也不算很低的 可以直接DFS呀呀呀呀 ...
- hdu 2821 Pusher(dfs)
Problem Description PusherBoy is an online game http://www.hacker.org/push . There is an R * C grid, ...
- HDU 1501 Zipper(DFS)
Problem Description Given three strings, you are to determine whether the third string can be formed ...
- HDU 2553 N皇后问题(dfs)
N皇后问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 在 ...
- HDU 5934 Bomb(炸弹)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
随机推荐
- 关于Python多线程condition变量的应用
''' 所谓条件变量,即这种机制是在满足了特定的条件后,线程才可以访问相关的数据. 它使用Condition类来完成,由于它也可以像锁机制那样用,所以它也有acquire方法和release方法,而且 ...
- 如何把mysql的列修改成行显示数据简单实现
如何把mysql的列修改成行显示数据简单实现 创建测试表: 1: DROP TABLE IF EXISTS `test`; 2: CREATE TABLE `test` ( 3: `year` int ...
- vue路由传参(学习心得)
如果组件通过query来传递num参数为1,相当与在 url 地址后面拼接参数 <template> <div> <h3>首页</h3> <rou ...
- Linux下如何从mysql数据库里导出导入数据
https://blog.csdn.net/u012884402/article/details/47337701 一. 表的导入 1.进入数据库 mysql 数据库名 2.查看表 show tab ...
- 6.15 分解IP地址
问题:将一个IP地址字段分解到列中,考虑下面列出的IP地址: 111.22.3.4 要得到如下所示的查询结果: +-----+----+---+---+| a | b | c | d |+--- ...
- Getting start with dbus in systemd (03) - sd-bus.h 使用例子 (systemd version>=221)
sd-bus.h 例子 注意: sd-dbus 是systemd提供的lib,但是这个lib,只有在systemd>v221版本后才可以使用,centos 219版本太低,所以不能使用. 参考: ...
- Python 爬虫爬取今日头条街拍上的图片
# 今日头条--街拍 import requests from urllib.parse import urlencode import os from hashlib import md5 from ...
- Java之希尔排序
希尔排序 前面已经知道了插入排序,明白插入排序的原理,不断比较来交换相邻的元素,这样的话效率不高,为此希尔排序,在插入排序上做出了改进,通过间隔增量来比较并交换元素,这样可以减少比较交换的次数. pa ...
- 网络基础——TCP/IP五层模型
TCP/IP五层模型 TCP/IP五层协议和OSI的七层协议对应关系如下 在每一层都工作着不同的设备,比如我们常用的交换机就工作在数据链路层的,一般的路由器是工作在网络层的. 在每一层实现的协议也各不 ...
- naca0012
naca0012 naca0012 Table of Contents 1. NACA0012 lift and drag from 0-180 1.1. Data– Cl Cd vs. aoa 2. ...