hdu 5305 Friends(2015多校第二場第6題)記憶化搜索

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5305

題意:給你n個人,m條關係,關係可以是online也可以是offline,讓你求在保證所有人online關係的朋友和offline關係的朋友相等的情況下,這樣的情況有多少種。

思路:因爲online關係和offline關係的人數相等,而且m最多才28,所以只要枚舉每個人的一半的關係是否符合要求即可,而且根據題意m是奇數或者有一個人的總關係爲奇數那麼就沒有符合要求的情況,這樣可以排除很多情況。

代碼:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
#define LL __int64

int f[10],on[10],off[10];
int m,n;
struct node
{
    int x,y;
}nn[30];
void init()
{
    memset(f,0,sizeof(f));
    memset(on,0,sizeof(on));
    memset(off,0,sizeof(off));
}
int dfs(int cot)
{
    int x,y,i,ans;
    ans=0;
    if(cot>=m)
    {
        for(i=1;i<=n;i++)
        {
            if(on[i]!=off[i])
                return 0;
        }
        return 1;
    }
    x=nn[cot].x;
    y=nn[cot].y;
    if(on[x]<f[x]/2&&on[y]<f[y]/2)
    {
        on[x]++;
        on[y]++;
        ans+=dfs(cot+1);
        on[x]--;
        on[y]--;
    }
    if(off[x]<f[x]/2&&off[y]<f[y]/2)
    {
        off[x]++;
        off[y]++;
        ans+=dfs(cot+1);
        off[x]--;
        off[y]--;
    }
    return ans;
}

int main()
{
    int i,T,ans;
    while(~scanf("%d",&T))
    {
        while(T--)
        {
            scanf("%d%d",&n,&m);
            init();
            for(i=0;i<m;i++)
            {
                scanf("%d%d",&nn[i].x,&nn[i].y);
                f[nn[i].x]++;
                f[nn[i].y]++;
            }
            if(m&1)
            {
                printf("0\n");
                continue;
            }
            int flag=0;
            for(i=1;i<=n;i++)
            {
                if(f[i]&1)
                {
                    flag=1;
                    break;
                }
            }
            if(flag)
            {
                printf("0\n");
                continue;
            }
            ans=dfs(0);
            printf("%d\n",ans);
        }
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章