Friends
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 878 Accepted Submission(s): 422
Problem Description
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
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
2015 Multi-University Training Contest 2
题意:n个人,分别有各自的朋友,有的关系好,有的关系不好,现在要求
每个人的朋友中关系好的与关系不好的数量要相同,问多少种方案?
思路:因为需要关系好的与关系不好的数量要相同,所以朋友的数量为奇数
的可以直接输出0,(因为奇数没有办法让两者相同),判断完奇数后进行搜索,先找出朋友中关系好的,剩下的自动归为关系不好的之中,如果出现两个人之间有一个人好朋友与坏朋友已经满了的,直接return,一个省时间的地方。
比赛的时候让队友做的,当时没有看出来是搜索,啊啊啊啊啊
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int n,m;
int num[10];
int pa[10],pb[10];
int sum;
struct node
{
int x;
int y;
}q[100100];
void DFS(int p)
{
//printf("p = %d\n",p);
if(p == m)
{
sum++;
return ;
}
int x = q[p].x;
int y = q[p].y;
if(pa[x] && pa[y])
{
pa[x]--;
pa[y]--;
DFS(p+1);
pa[x]++;
pa[y]++;
}
if(pb[x] && pb[y])
{
pb[x]--;
pb[y]--;
DFS(p+1);
pb[x]++;
pb[y]++;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
sum = 0;
memset(num,0,sizeof(num));
scanf("%d%d",&n,&m);
int x,y;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
q[i].x = x;
q[i].y = y;
num[x]++;
num[y]++;
}
int flag = 0;
for(int i=1;i<=n;i++)
{
pa[i] = num[i]/2;
pb[i] = num[i]/2;
if(num[i]%2 == 1)
{
flag = 1;
break;
}
}
if(flag)
{
printf("0\n");
continue;
}
DFS(0);
printf("%d\n",sum);
}
return 0;
}