0
点赞
收藏
分享

微信扫一扫

HDU 5305 Friends(简单DFS)


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;
}






 

举报

相关推荐

0 条评论