2015多校训练第二场 hdu5305

把这题想复杂了,一直在考虑怎么快速的判断将选的边和已选的边无冲突,后来经人提醒发现这根本没必要,反正数据也不大开两个数组爆搜就OK了,搜索之前要先排除两种没必要搜的情况,这很容易想到,爆搜的时候注意几个小细节就可以了(代码代码注释中已标好)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<utility>
using namespace std;
typedef pair<int,int> P;

vector<int> gt[30];
int g[36][36];
int c0[36],c1[36];
int count;
int n,m;
void dfs(int x,int y)
{
    if(x>n)
    {
        count++;
//        printf("%d\n",count);
        return;
    }
    else if(y>n)
    {
        if(c0[x]!=c1[x]) return;
        dfs(x+1,x+2);   //  注意这里不是从1开始  原因很简单 因为前面的都已经标记过了
    }
    else
    if(g[x][y])
    {
        c0[x]++;
        c0[y]++;    //  注意这里是y  把一条边划分之后,两个点都被划分了
        dfs(x,y+1);
        c0[x]--;
        c0[y]--;

        c1[x]++;
        c1[y]++;
        dfs(x,y+1);
        c1[x]--;
        c1[y]--;
    }
    else if(g[x][y]==0) dfs(x,y+1);
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        count=0;
        scanf("%d%d",&n,&m);
        memset(g,0,sizeof(g));
        memset(c1,0,sizeof(c1));
        memset(c0,0,sizeof(c0));
        for(int k=1;k<=n;k++)
           gt[k].clear();
        for(int i=0;i<m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            gt[a].push_back(b);
            gt[b].push_back(a);
            g[a][b]=g[b][a]=1;
        }
        int f=0;
        for(int j=1;j<=n;j++)
        {
            if(gt[j].size()%2) f=1;
        }
        if(f||m%2)
        {
            printf("0\n");
            continue;
        }
        dfs(1,2);   //  0 代表 网络  1代表现实
        printf("%d\n",count);
    }
}

,无脑不许想太多、、、、

时间: 2024-10-12 22:47:06

2015多校训练第二场 hdu5305的相关文章

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

2015 多校赛 第二场 1002 (hdu 5301)

Description Your current task is to make a ground plan for a residential building located in HZXJHS. So you must determine a way to split the floor building with walls to make apartments in the shape of a rectangle. Each built wall must be paralled t

2015 多校赛 第二场 1004 hdu(5303)

Problem Description There are n apple trees planted along a cyclic road, which is L metres long. Your storehouse is built at position 0 on that cyclic road.The ith tree is planted at position xi, clockwise from position 0. There are ai delicious appl

CSU 多校训练第二场 J Pinemi Puzzles

传送门:http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2279 题意: 代码: #include <set> #include <map> #include <deque> #include <queue> #include <stack> #include <cmath> #include <ctime> #include <bitset>

计蒜之道2015程序设计大赛初赛第二场——人人都有极客精神

计蒜之道2015程序设计大赛初赛第二场——人人都有极客精神 (一)体面 人人公司是一家极为鼓励极客精神的公司,当有重要的项目需要上线但又时间太紧,甚至需要当天上线的时候,往往会挂起海盗旗开启电子日期显示,让大家可以在对时间有更明确的感知的情况下,同心协力搞定重要的项目.海盗旗下方的电子屏显示的日期形式为 YYYYMMDD (年份占 4 位.月份占 2 位.天数占 2 位). 日期电子屏幕上每个数字对应的显示如下图: 从上图可以得知每个数字对应的笔画数,比如 2 的笔画数是 5,8 的笔画数是 7

hdu 5288||2015多校联合第一场1001题

http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number of i (l<=i<=r) , that there's no j(l<=j<=r,j<>i) satisfy ai mod aj=0,now OO want to know ∑i

hdu5289||2015多校联合第一场1002贪心+RMQ

http://acm.hdu.edu.cn/showproblem.php?pid=5289 Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n in this company, and every staff has a ability. Now, Tom is going to assign a special task to

HDU 5742 It&#39;s All In The Mind (贪心) 2016杭电多校联合第二场

题目:传送门. 题意:求题目中的公式的最大值,且满足题目中的三个条件. 题解:前两个数越大越好. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; int gcd(int a,int b) { if(!b) return a; return gcd(b,a%b); } int main() { int t; ci