Friends
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
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.
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
n最大为8,DFS爆搜即可,但是比赛的时候没有做出来,因为我DFS搜的是点,比较难写。看了看网上的题解,基本都是DFS搜边, 对每一条边,将边分为在线或离线即可,分完后判断是否符合题意。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <bitset>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define maxn 100017
#define ll long long
using namespace std;
int d1[10], d2[10], sum[10];
int n, m;
int ans = 0, a[30], b[30];
int judge()
{
for (int i = 1; i <= n; i++)
{
if (d1[i] != d2[i])
{
return 0;
}
}
return 1;
}
void dfs(int num)
{
if (num == m + 1)
{
if (judge())
{
ans++;
}
return ;
}
int x = a[num], y = b[num];
if ((d1[x] < sum[x] / 2) && (d1[y] < sum[y] / 2))
{
d1[x]++;
d1[y]++;
dfs(num + 1);
d1[x]--;
d1[y]--;
}
if ((d2[x] < sum[x] / 2) && (d2[y] < sum[y] / 2))
{
d2[x]++;
d2[y]++;
dfs(num + 1);
d2[x]--;
d2[y]--;
}
}
int main()
{
int t;
while (scanf("%d", &t) != EOF)
{
while (t--)
{
memset(d1, 0, sizeof(d1));
memset(d2, 0, sizeof(d2));
memset(sum, 0, sizeof(sum));
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++)
{
scanf("%d%d", &a[i], &b[i]);
sum[a[i]]++;
sum[b[i]]++;
}
ans = 0;
int ok = 1;
for (int i = 1; i <= n; i++)
{
if (sum[i] & 1)
{
ok = 0;
break;
}
}
if (ok)
{
dfs(1);
printf("%d\n", ans);
}
else
{
printf("0\n");
}
}
}
return 0;
}