• 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;
    }
    


  • 相关阅读:
    Java笔记(11):Eclipse使用
    Java笔记(10):面向对象--内部类
    JVM监控及分析(02)
    JVM监控及分析(01)
    Java笔记(09):面向对象--接口
    Java笔记(08):面向对象--抽象类
    Java笔记(07):面向对象--多态
    环境搭建--apache/tomcat/nginx
    Linux监控分析
    HTML语法大全
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6918649.html
Copyright © 2020-2023  润新知