*HDU 5305 - Friends (DFS + 剪枝)

来源:互联网 发布:学校宿舍网络设计 编辑:程序博客网 时间:2024/05/16 02:05

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=5305

题意:

n个人,m条边,每个人与他连边的人的关系有两种,两种关系的人数必须相同,求出方案数。

思路:

由于n<=8,m<=(8*7/2) = 28,因为每个人确定了1/2边之后剩下的边也就确定了,所有只要枚举 一半的边即可。

BFS,该边选或者不选。

AC.

#include <iostream>#include <cstdio>#include <vector>#include <cstring>using namespace std;int to[10], n, m, d[10], num;int u[100], v[100];int dfs(int x){    if(num*2 >= m) {        for(int i = 1; i <= n; ++i) {            if(d[i]*2 != to[i]) return 0;        }        return 1;    }    int ans = 0;    if(d[u[x]]*2 < to[u[x]] && d[v[x]]*2 < to[v[x]]) {        num++;        d[u[x]]++; d[v[x]]++;        ans += dfs(x+1);        num--;        d[u[x]]--; d[v[x]]--;    }    if(m/2 - num < m - x)        ans += dfs(x+1);    return ans;}int judge(){    for(int i = 1; i <= n; ++i) {        if(to[i] % 2) return 0;    }    memset(d, 0, sizeof(d));    num = 0;    return dfs(0);}int main(){    //freopen("in", "r", stdin);    int T;    scanf("%d", &T);    while(T--) {        memset(to, 0, sizeof(to));        scanf("%d%d", &n, &m);        for(int i  = 0; i < m; ++i) {            scanf("%d %d", &u[i], &v[i]);            to[u[i]] ++;            to[v[i]] ++;        }        printf("%d\n", judge());    }    return 0;}


0 0
原创粉丝点击