Friends

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 297    Accepted Submission(s): 127

Problem Description
There are n people
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. 
 
Input
The first line of the input is a single integer T (T=100),
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. 
 
Output
For each testcase, print one number indicating the answer.
 
Sample Input
2
3 3
1 2
2 3
3 1
4 4
1 2
2 3
3 4
4 1
 
Sample Output
0
2
 
Source

/*

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

  1. HDU 5965 扫雷(dfs)题解

    题意:给你一个3*n的格子,中间那行表明的是周围8格(当然左右都没有)的炸弹数量,上下两行都可以放炸弹,问你有几种可能,对mod取模 思路:显然(不),当i - 1和i - 2确定时,那么i的个数一定 ...

  2. HDU 1518 Square(DFS)

    Problem Description Given a set of sticks of various lengths, is it possible to join them end-to-end ...

  3. HDU 1015 Safecracker (DFS)

    题意:给一个数字n(n<=12000000)和一个字符串s(s<=17),字符串的全是有大写字母组成,字母的大小按照字母表的顺序,比如(A=1,B=2,......Z=26),从该字符串中 ...

  4. Hdu 1175 连连看(DFS)

    Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175 因为题目只问能不能搜到,没问最少要几个弯才能搜到,所以我采取了DFS. 因为与Hdu ...

  5. hdu 2821 Pusher (dfs)

    把这个写出来是不是就意味着把   http://www.hacker.org/push  这个游戏打爆了? ~啊哈哈哈 其实只要找到一个就可以退出了  所以效率也不算很低的  可以直接DFS呀呀呀呀 ...

  6. hdu 2821 Pusher(dfs)

    Problem Description PusherBoy is an online game http://www.hacker.org/push . There is an R * C grid, ...

  7. HDU 1501 Zipper(DFS)

    Problem Description Given three strings, you are to determine whether the third string can be formed ...

  8. HDU 2553 N皇后问题(dfs)

    N皇后问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在 ...

  9. HDU 5934 Bomb(炸弹)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

随机推荐

  1. 前端--2、CSS基础

    CSS的部分: CSS四种类引入方式(了解) style的定义原则: 基本选择器 示例: 层级选择器 组合选择器 后代选择器 ★ 子代选择器 毗邻选择器 普通兄弟选择器 “与”选择器 ★ “或”选择器 ...

  2. Elasticsearch--扩展索引结构

    目录 索引树形数据 索引非扁平数据 索引关系型数据 使用嵌套对象 评分与嵌套查询 使用主从关系 索引树形数据 使用path_analyzer分析树形数据字段 索引非扁平数据 数据如下: { " ...

  3. FCC 基础JavaScript 练习2

    1. 引号不是字符串中唯一的可以被转义字符.下面是常见的转义序列列表: \'  单引号 \" 双引号 \\ 反斜杠符 \n 换行符 \r 回车符 \t 制表符 \b 退格符 \f  换页符 ...

  4. 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析

    对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...

  5. Linux系统的启动流程

    Linux系统的启动流程: 1.通电(通常按下电源键,开始通电) 2.加载BIOS (通常看到显示器提示按F2进入主板) 3.读取MBR (MBR硬盘的入口地址,用来装载引导) 4.进入引导 (通常有 ...

  6. swift- mutating

    struct Stack<Element> { var items = [Element]() func push(_ item:Element){ self.items.append(i ...

  7. Linux 中ifconfig和ip addr命令查看不到ip解决方法

    1.输入查看ip的命令ifconfig或ip addr,查不到ip 2.查看ens33网卡配置,输入 vi /etc/sysconfig/network-scripts/ifcfg-ens33 将ON ...

  8. VMware vCenter 6.5 安装及群集配置介绍

    一.介绍 VMware vCenter Server 提供了一个可伸缩.可扩展的平台,为虚拟化管理奠定了基础.可集中管理VMware vSphere环境,与其他管理平台相比,极大地提高了 IT 管理员 ...

  9. java_线程类的基本功能

    Thread类是实现了Runnable接口 其方法有: start()开始:开始线程 run()跑:线程内容 currentThread()现在的线程:返回当前线程 getName():获取线程名 s ...

  10. PHP 浏览器端输出中文正常,cmd中文乱码

    cmd 运行php脚本乱码问题如果别的编码根据下面的自己换吧!chcp 65001 就是换成UTF-8chcp 936 可以换回默认的GBKchcp 437 是美国英语