hdu5305(2015多校2)--Friends(状压,深搜)

Friends

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 668    Accepted Submission(s): 313

Problem Description

There are 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

The first line of the input is a single integer 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

题目大意:给出n个人,m个朋友关系,每个关系可以为在线或离线,问如果要让每个人的在线朋友数和离线朋友数相同,那么关系组成有多少种情况。(n<=8,m<=n*(n-1)/2)

由题目可以推出如果m=25,26,27,28,那么n一定为8,那么总会有一个人的朋友数位奇数,关系组成情况数为0

现在m最大为24,那么就很好做了,可以对关系进行状压(0:离线,1:在线),或者直接深搜,方式都是一样的,遍历所有的情况。

注意:m为24时数目还是比较大的,需要剪枝一下,可以在每个人的关系中选出一条,这一条边是不用枚举的,因为可以由已经推出的情况来决定这条边是不是在线,这样至少会减少1条边,每减少一条边,那么搜索的复杂度就会减少一半。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
struct node{
    int u , v ;
}p[30];
int n , m ;
int sum[10] , num[10] , cnt , flag[10] , vis[10] ;
void dfs(int s) {
    int i ;
    if( s == m ) {
        for(i = 1 ; i <= n ; i++) {
            if( sum[i]/2 == num[i]+1 && i < flag[i] ) {
                num[i]++ ;
                num[ flag[i] ]++ ;
                vis[i] = 1 ;
            }
            if( sum[i]/2 != num[i] ) break ;
        }
        if( i > n ) cnt++ ;
        for(i = 1 ; i <= n ; i++) {
            if( vis[i] ) {
                num[i]-- ;
                num[ flag[i] ]-- ;
                vis[i] = 0 ;
            }
        }
        return ;
    }
    dfs(s+1) ;
    num[ p[s].u ]++ ;
    num[ p[s].v ]++ ;
    dfs(s+1) ;
    num[ p[s].u ]-- ;
    num[ p[s].v ]-- ;
}
int main() {
    int t , i ;
    int u , v , cid ;
    //freopen("f.in","r",stdin) ;
    //freopen("1.txt","w",stdout) ;
    scanf("%d", &t) ;
    while( t-- ) {
        scanf("%d %d", &n, &m) ;
        memset(sum,0,sizeof(sum)) ;
        memset(num,0,sizeof(num)) ;
        memset(flag,0,sizeof(flag)) ;
        memset(vis,0,sizeof(vis)) ;
        cid = cnt = 0 ;
        for(i = 0 ; i < m ; i++) {
            scanf("%d %d", &u, &v) ;
            sum[u]++ ;
            sum[v]++ ;
            if( flag[u] == 0 && flag[v] == 0 ) {
                flag[u] = v ;
                flag[v] = u ;
            }
            else {
                p[cid].u = u ;
                p[cid++].v = v ;
            }
        }
        m = cid ;
        for(i = 1 ; i <= n ; i++)
            if( sum[i]%2 ) break ;
        if( i <= n ) {
            printf("0\n") ;
            continue ;
        }
        /*if( n == 8 && m == 24 ) {
            printf("2648\n") ;
            continue ;
        }*/
        dfs(0) ;
        printf("%d\n", cnt) ;
    }
    return 0 ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 03:10:00

hdu5305(2015多校2)--Friends(状压,深搜)的相关文章

【NOIP2016提高组】愤怒的小鸟(状压宽搜)

题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可以用它向第一象限发射一只红色的小鸟,小鸟们的飞行轨迹均为形如的曲线,其中a,b是Kiana指定的参数,且必须满足a<0. 当小鸟落回地面(即x轴)时,它就会瞬间消失. 在游戏的某个关卡里,平面的第一象限中有n只绿色的小猪,其中第i只小猪所在的坐标为(xi,yi). 如果某只小鸟的飞行轨迹经过了(xi,yi),那么第i只小猪就会被消灭掉,同时小鸟将会沿着原先

篮球校赛(状压dp)

篮球校赛 题目描述 JWJU注重培养学生的“唱,跳,rap,篮球”能力.于是每年JWJU都会举办篮球校赛,来给同学们一个切磋篮球技术的平台.校赛冠军的奖励是看wls女装一次,为了这个目标,大家都努力训练,希望自己能看到wls女装. 教练mymy手下有 nn 名队员,现在他要挑选 55 人组成一个篮球队来参赛.众所周知,一个篮球队伍有五个不同的位置(控球后卫,得分后卫,小前锋,大前锋,中锋),现在教练mymy给出每名队员在每个位置的能力. 注:如果一个队员作为控球后卫出战,则他只能发挥他的控球后卫

2015广东工业大学ACM校赛 I 游戏王 (状压dp)

Problem I: 游戏王 Description 小学的时候,Stubird非常喜欢玩游戏王,有一天,他发现了一个绝佳的连锁组合,这个连锁组合需要6张卡, 可是他一张都没有,但是他的那些朋友们有,不过当然,他们不会白给,不过也不排除有人和他交情好,送给他了. 不过他们有成全别人的美德,当他们看到Stubird已经有某些他们喜欢的卡的时候,他们会给他优惠,或者更贵也说不定 嘛不过,你可以把有的卡片藏起来,不告诉他们,来获得更低的价格. 问他最少需要多少钱才可以集齐所有的卡. Input 第一行

[hdu 4899]14年多校第四场C Hero meet devil 状压DP

Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 122    Accepted Submission(s): 49 Problem Description There is an old country and the king fell in love with a devil. The devil always asks th

【弱校胡策】2016.4.14 (bzoj2164)最短路+状压DP+矩阵乘法+高斯消元+树链剖分+线段树+背包DP

cyyz&qhyz&lwyz&gryz弱校胡策 命题人:cyyz ws_fqk T3暴力写挫了 50+10+0滚粗辣! 奇妙的约会(appointment.cpp/c/pas) [问题描述] DQS和sxb在网上结识后成为了非常好的朋友,并且都有着惊人 的OI水平.在NOI2333的比赛中,两人均拿到了金牌,并保送进入 HU/PKU.于是两人决定在这喜大普奔的时刻进行面基. NOI2333参赛选手众多,所以安排了n个考点,DQS在1号考点, 而sxb在n号考点.由于是举办全国性赛事

多校7 HDU5816 Hearthstone 状压DP+全排列

1 多校7 HDU5816 Hearthstone 状压DP+全排列 2 题意:boss的PH为p,n张A牌,m张B牌.抽取一张牌,能胜利的概率是多少? 3 如果抽到的是A牌,当剩余牌的数目不少于2张,再从剩余牌里抽两张,否则全部拿完. 4 每次拿到一张B牌,对boss伤害B[i]的值 5 思路:dp[i]表示状态为i时的方案数 6 先处理出所有状态下的方案,再枚举每种状态,如果符合ans+=dp[i]*剩余数的全排列 7 当前集合里有a张A,b张B,那么还能取的牌数:a*2-a-b+1 8 9

BZOJ 4197 NOI 2015 寿司晚宴 状压DP

4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status][Discuss] Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n?1 种不同的寿司,编号 1,2,3,-,n?1,其中第 i 种寿司的美味度为 i+1 (即

hdu5293(2015多校1)--Tree chain problem(树状dp)

Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 262    Accepted Submission(s): 59 Problem Description Coco has a tree, whose vertices are conveniently labeled by 1,2,-,n. The

hdu 5471(状压DP or 容斥)

想了最复杂的思路,用了最纠结的方法,花了最长的时间,蒙了一种规律然后莫名其妙的过了. MD 我也太淼了. 后面想了下用状压好像还是挺好写的,而且复杂度也不高.推出的这个容斥的规律也没完全想透我就CAO. Count the Grid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 400    Accepted Submission(s)