zoukankan      html  css  js  c++  java
  • hdu5823 (附带数的二进制子集)

    二进制数子集的取法,结果不会输出0,且从大到小

                for(int i0 = i;i0;i0=(i0-1)&i)
                         cout<<i0<<endl;   
                         

    题意:

    给定一个 N个点的图, 
    求它的每一个子图的最小染色数 

    染色方法是所有子图中相连接两点颜色不一致

    其中 N18

    题解:

    先状压表示出所有的子集状态,即每个子集取那些点

    然后枚举出那些子集是独立集,即没有边相连

    然后dp,将每个子集的独立集取出并取min,求出答案

    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    #include <iostream>
    #include <map>
    #include <queue>
    #include <stack>
    using namespace std;
    #define PF(x) cout << "debug: " << x << " ";
    #define EL cout << endl;
    #define PC(x) puts(x);
    typedef long long ll;
    const int maxn = 100000+10;
    const int MOD = 1e9+7;
    int t,n,inv[1<<20];
    char g[30][30];
    ll res[1<<20];
    int main()
    {
       // freopen("in.txt","r",stdin);
        cin>>t;
        while(t--){
            memset(inv,0,sizeof(inv));
            scanf("%d",&n);
            for(int i=0;i<n;i++){
                scanf("%s",g[i]);
                //cout<<g[i]+1<<endl;
            }
            int fg=(1<<n)-1;
            for(int i=1;i<=fg;i++){
                for(int j=0;j<n;j++){
                    if((i>>j)&1){
                        for(int k = j+1;k < n;k ++){
                            if(((i>>k)&1)&&g[j][k]=='1'){
                                inv[i]=1;//非独立集标志为1
                                break;
                            }
                        }
                    }
                    if(inv[i])
                        break;
                }
            }
            memset(res,0x3f,sizeof(res));
            res[0]=0;
            for(int i=1;i<=fg;i++){
                for(int i0 = i;i0;i0=(i0-1)&i){//取二进制数子集的方法
                    if(!inv[i0]){
                        res[i]=min(res[i],res[i^i0]+1);
                        //cout<<res[i]<<endl;
                    }
                }
            }
            unsigned int res1=1,ans=0;
            for(int i=1;i<=fg;i++) ans+=(res1*=233)*res[i];//用usigned会自动从0取膜,正好取usigned的数据范围2^32
            printf("%u
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    laravel 解决保存Emoji 表情问题
    下载微信头像下载不了
    微信公众号开发遇到simplexml_load_string 未定义
    部署php的正确姿势
    ubuntu 安装 mysql 的正确姿势
    laravel 部署 前后端分离
    nwjs 解决手指可滑动问题
    Java8新特性Optional、接口中的默认方法与静态方法
    Java设计模式百例
    一位资深程序员大牛给予Java初学者的学习路线建议
  • 原文地址:https://www.cnblogs.com/shimu/p/5762884.html
Copyright © 2011-2022 走看看