您的位置:首页 > 其它

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 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 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: