HDU 5305 DFS

点击打开链接

题意:有n个人和m个关系,对于每个关系有两种可能性,然后每个人的这两种关系的数量必须相同,问你共有多少分配满足条件

思路:因为人比较少并且边也不多,我们可以直接暴力dfs将所有的情况全部找出来就行了,满足条件就是每个人的两种关系都相同

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int maxn=10;
int num1[maxn],num2[maxn],du[maxn],U[maxn*3],V[maxn*3];
int n,m,ans;
void dfs(int x){
    if(x==m+1){
        int flag=0;
        for(int i=1;i<=n;i++){
            if(num1[i]!=num2[i]) flag=1;
        }
        if(flag==0) ans++;
        return ;
    }
    if(num1[U[x]]<du[U[x]]/2&&num1[V[x]]<du[V[x]]/2){
        num1[U[x]]++;num1[V[x]]++;
        dfs(x+1);
        num1[U[x]]--;num1[V[x]]--;
    }
    if(num2[U[x]]<du[U[x]]/2&&num2[V[x]]<du[V[x]]/2){
        num2[U[x]]++;num2[V[x]]++;
        dfs(x+1);
        num2[U[x]]--;num2[V[x]]--;
    }
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        memset(num1,0,sizeof(num1));
        memset(num2,0,sizeof(num2));
        memset(du,0,sizeof(du));
        for(int i=1;i<=m;i++){
            scanf("%d%d",&U[i],&V[i]);
            du[U[i]]++;du[V[i]]++;
        }
        ans=0;dfs(1);
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(ACM,图论,DFS,HDU)