HDU 5305 Friends (DFS)
2015-07-23 22:12
387 查看
Friends
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total
Submission(s): 163 Accepted Submission(s): 61
Problem DescriptionThere 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 thesen
people wants to have the same number of online and offline friends (i.e. If one person hasx
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.
[align=left]Input[/align]
The first line of the input is a single integerT (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 nextm
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.
[align=left]Output[/align]
For each testcase, print one number indicating the answer.
[align=left]Sample Input[/align]
2
3 3
1 2
2 3
3 1
4 4
1 2
2 3
3 4
4 1
[align=left]Sample Output[/align]
0
2
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
struct edge
{
int u, v;
};
edge e[30];
int deg[30], c1[30], c2[30];
int t, n, m, ans;
void dfs(int cur)
{
if(cur==m)
{
ans++;
return;
}
int u=e[cur].u, v=e[cur].v;
if(c1[u] && c1[v])
{
c1[u]--, c1[v]--;
dfs(cur+1);
c1[u]++, c1[v]++;
}
if(c2[u] && c2[v])
{
c2[u]--, c2[v]--;
dfs(cur+1);
c2[u]++, c2[v]++;
}
return;
}
int main()
{
scanf("%d", &t);
while(t--)
{
memset(deg, 0, sizeof(deg));
scanf("%d%d", &n, &m);
for(int i=0; i<m; i++)
{
scanf("%d%d", &e[i].u, &e[i].v);
deg[e[i].u]++;
deg[e[i].v]++;
}
bool flag=true;
for(int i=1; i<=n; i++)
{
if(deg[i]%2)
{
flag=false;
break;
}
c1[i]=deg[i]/2;
c2[i]=deg[i]/2;
}
ans=0;
if(flag)
{
dfs(0);
printf("%d\n", ans);
}
else
{
printf("0\n");
}
}
return 0;
}
相关文章推荐
- 小白学开发(iOS)OC_类和对象(2015-07-22)
- Linux kernel 分析之二十:内存管理-内核中的页表映射总结
- 操作系统 进程调度算法 浅析
- Teamcenter WorkFlow(三)
- an internal error occurred during building workspace
- 昼夜系统-游戏中的时间
- 正则表达式匹配手机的几种写法
- 关系型数据库与NOSQL基本概念
- 如何用jquery写一个简单的返回顶部
- mate-desktop安装在其他目录时一些配置信息
- 关于中文乱码
- 给部分培训学生的建议
- QEMU-System mode emulation分析(2)
- 使用 ALinq 实现 Linq to MySQL【转】
- 犀牛——第6章对象6.2属性的查询和设置
- 图的邻接表表示法及深度搜索与广度搜索
- 给出a的定义 -- 指针 和 数组
- ioremap 函数映射操作已知的物理地址(寄存器、端口、IO)
- 关于hibernate插入mysql数据库中文数据乱码处理
- eclipse中SVN分支合并到主干