HDU 5305 DFS

来源:互联网 发布:ubuntu 永久dns 编辑:程序博客网 时间:2024/06/03 12:43

点击打开链接

题意:有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;}

1 0
原创粉丝点击