zoukankan      html  css  js  c++  java
  • 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,sizeof(deg));
        res = 0;
    }
    
    void dfs(int u){
        //printf("%d
    ",u);
        if(u == m){
            res++;
            return;
        }
        int a,b;
        a = G[u].a;b = G[u].b;
        deg[a]--;deg[b]--;
    
        on[a]++;on[b]++;
        if((deg[a] && deg[b]) ||
           (!deg[a] && deg[b] && on[a] == off[a]) ||
           (!deg[b] && deg[a] && on[b] == off[b]) ||
           (!deg[a] && !deg[b] && on[a] == off[a] && on[b] == off[b]))
            dfs(u+1);
        on[a]--;on[b]--;
    
        off[a]++;off[b]++;
        if((deg[a] && deg[b]) ||
           (!deg[a] && deg[b] && on[a] == off[a]) ||
           (!deg[b] && deg[a] && on[b] == off[b]) ||
           (!deg[a] && !deg[b] && on[a] == off[a] && on[b] == off[b]))
            dfs(u+1);
        off[a]--;off[b]--;
        deg[a]++;deg[b]++;
    }
    
    int main(){
        int cas;
    
        scanf("%d",&cas);
        while(cas--){
            scanf("%d%d",&n,&m);
            init();
            for(int i=0;i<m;i++){
                scanf("%d%d",&G[i].a,&G[i].b);
                deg[G[i].a]++;deg[G[i].b]++;
            }
            dfs(0);
            printf("%d
    ",res);
        }
        return 0;
    }
    


  • 相关阅读:
    Android开发系列之ListView用法
    自省
    fake feeling ?
    我心中的天使
    2020.6.16
    python面试题
    tcp
    Short + skip + limit
    01_pyttsx3_将文本文字转为语音播放
    mongo_Linux下不进入数据库查数据
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6918649.html
Copyright © 2011-2022 走看看