HDU 5305 Friends

水水的DFS

题意:n个人m个关系,要求每个人的网上朋友和现实朋友一样多,求一共有多少种关系

解:因为数据小,暴力DFS就可以了,不过要一点小剪枝

#include <stdio.h>
#include <string.h>
int point[10];
struct aaa
{
    int x,y;
}line[30];
struct bbb
{
    int online,outline;
}node[10];
int sum;
void dfs(int n,int m,int p)
{
    if(p>m)
    {
        int flag=0;
        for(int i=1;i<=n;i++)
        {
            if(node[i].online!=node[i].outline||node[i].online!=point[i])
            {
                flag=1;
                break;
            }
        }
        if(flag==0)
            sum++;
        return ;
    }
    int t=line[p].x,tt=line[p].y;
    for(int i=1;i<=2;i++)
    {
        if(i==1)
        {
            node[t].online++;
            node[tt].online++;
            if(node[t].online>point[t]||node[tt].online>point[tt])
            {
                node[t].online--;
                node[tt].online--;
                continue;
            }
        }
        if(i==2)
        {
            node[t].outline++;
            node[tt].outline++;
            if(node[t].outline>point[t]||node[tt].outline>point[tt])
            {
                node[t].outline--;
                node[tt].outline--;
                continue;
            }
        }
        dfs(n,m,p+1);
        if(i==1)
        {
            node[t].online--;
            node[tt].online--;
        }
        else
        {
            node[t].outline--;
            node[tt].outline--;
        }
    }
    return ;
}
int main()
{
    int t,n,m;
    int x,y;
    while(scanf("%d",&t)!=-1)
    {
        while(t--)
        {
            memset(point,0,sizeof(point));
            memset(line,0,sizeof(line));
            memset(node,0,sizeof(node));
            int flag=1;
            sum=0;
            scanf("%d%d",&n,&m);
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d",&line[i].x,&line[i].y);
                point[line[i].x]++;
                point[line[i].y]++;
            }
            if(n==m&&n%2!=0)         //剪枝
            {
                printf("0\n");
                continue;
            }
            for(int i=1;i<=n;i++)      //剪枝
            {
                if(point[i]%2!=0)
                {
                    printf("0\n");
                    flag=0;
                    break;
                }
                point[i]/=2;
            }
            if(!flag)
                continue;
            dfs(n,m,1);
            printf("%d\n",sum);
        }
    }
    return 0;
}

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

时间: 2024-10-11 20:25:17

HDU 5305 Friends的相关文章

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是奇数或者有一个人的总关系为奇数那么就没有符合要求的情况,这样可以排除很多情况.

hdu 5305 Friends 【暴搜】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5305 题意:给一个无向图 , 每条边可以是online边也可以是offline边,问 有多少种方法使得每个节点的online边和offline边一样多 解法:暴搜.记录每个点连接的边数,奇数的直接不可能,偶数的分成两个数组,c1[i]表示i的在线朋友数,c2[i]表示i的离线朋友数,然后一条边一条边搜就行了. 代码: #include <stdio.h> #include <ctime>

HDU 5305 Friends (深搜)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5305 题面: Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1149    Accepted Submission(s): 569 Problem Description There are n people and m

hdu 5305(爆搜+二染色) Friends

题意: 有n个人m对朋友,朋友有两种一种online的,一种face to face的.现在要让你对这些朋友性质进行安排,让每一个人的线上朋友和线下朋友人数是相同的,求满足的方案数. 思路 直接暴力染色. 然后减减枝. 一个就是对于每个人的度一定是偶数. 另外一个就是染色中,对于一个节点染色的不能超过一半才能继续dfs. 参考code: /* #pragma warning (disable: 4786) #pragma comment (linker, "/STACK:0x800000&quo

hdu 5305 Friends (dfs)

Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1539    Accepted Submission(s): 784 Problem Description There are n people and m pairs of friends. For every pair of friends, they can cho

!HDU 5305 朋友关系网一半网友问题-dfs-(暴力搜索)

题意:有n个人,m个朋友关系,现在每个人的朋友中必须一半是online一半是offline,问你有几种分配方案. 分析: 昨天一看这题就知道自己做过,无奈想不起来啊,没做出来我就知道应该上一次也没做出来,果然是.勤补题才是王道. 这题用深搜.搜索还是不太会用,这题我自己做的话估计怎么也想不到用dfs.努力啊少年. 代码: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm

HDU 5305 Friends(dfs)

Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 297    Accepted Submission(s): 127 Problem Description There are n people and m pairs of friends. For every pair of friends, they can cho

HDU 5305 Friends (搜索+剪枝) 2015多校联合第二场

開始对点搜索,直接写乱了.想了想对边搜索,尽管复杂度高.剪枝一下水过去了. 代码: #include<cstdio> #include<iostream> #include<cstring> #include<vector> using namespace std; struct Edge{ int a,b; }G[35]; int n,m,deg[10],on[10],off[10]; int res; void init(){ memset(deg,0,

2015 多校赛 第二场 1006 (hdu 5305)

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, everyo

HDU 5305 Friends (DFS)

Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 163    Accepted Submission(s): 61 Problem Description There are n people and m pairs of friends. For every pair of friends, they can choo