ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ZROI#1007

2019-09-23 15:00:25  阅读:254  来源: 互联网

标签:std ch int 1007 using include ZROI define


ZROI#1007

也是看起来非常不可做的一个题.

仔细思考,发现了一个很\(coool\)的事情:

他是不是让我求最小独立集覆盖...

一个独立集覆盖是指把图划分成若干个子集,每个子集里的点两两互不连通.

然后你\(2^n\)枚举子集,记录是不是一个独立集,然后在独立集上\(DP\).

你就令\(f_S\)表示点集为\(S\)时的最小独立集覆盖.

显然,每次可以从它一个是独立集的子集转移过来,取一个\(min\)就完了(最长路最短).

最后的答案是\(f_{U}-1\),其中\(U\)是全集.为什么减一啊?

因为最长路是边数啊...

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
#define MEM(x,y) memset ( x , y , sizeof ( x ) )
#define rep(i,a,b) for (int i = (a) ; i <= (b) ; ++ i)
#define per(i,a,b) for (int i = (a) ; i >= (b) ; -- i)
#define pii pair < int , int >
#define one first
#define two second
#define rint read<int>
#define int long long
#define pb push_back

using std::queue ;
using std::set ;
using std::pair ;
using std::max ;
using std::min ;
using std::priority_queue ;
using std::vector ;
using std::swap ;
using std::sort ;
using std::unique ;
using std::greater ;

template < class T >
    inline T read () {
        T x = 0 , f = 1 ; char ch = getchar () ;
        while ( ch < '0' || ch > '9' ) {
            if ( ch == '-' ) f = - 1 ;
            ch = getchar () ;
        }
       while ( ch >= '0' && ch <= '9' ) {
            x = ( x << 3 ) + ( x << 1 ) + ( ch - 48 ) ;
            ch = getchar () ;
       }
   return f * x ;
}

const int N = 20 ;
const int MAXS = 1 << 20 ;
int n , m , ans , s[N] ;
int g[MAXS] , f[MAXS] , cnt ;
bool e[N][N] ;

inline bool judge () {
    rep ( i , 1 , cnt ) rep ( j , 1 , cnt )
        if ( e[s[i]][s[j]] || e[s[j]][s[i]] ) return false ;
    return true ;
}

signed main (int argc , char * argv[]) {
    n = rint () ; m = rint () ;
    rep ( i , 1 , m ) {
        int u = rint () , v = rint () ;
        e[u][v] = e[v][u] = true ;
    }
    int maxsize = 1 << n ;
    for (int i = 0 ; i < maxsize ; ++ i) {
        cnt = 0 ;
        for (int j = 0 ; j < n ; ++ j)
            if ( i & ( 1 << j ) )
                s[++cnt] = j + 1 ;
        g[i] = judge () ;
    }
    MEM ( f , 0x7f ) ; f[0] = 0 ;
    for (int i = 0 ; i < maxsize ; ++ i) {
        for (int j = i ; j ; j = ( j - 1 ) & i )
            if ( ! g[j] ) continue ;
            else f[i] = min ( f[i] , f[i^j] + 1 ) ;
    }
    printf ("%lld\n" , f[maxsize-1] - 1 ) ;
    return 0 ;
}

标签:std,ch,int,1007,using,include,ZROI,define
来源: https://www.cnblogs.com/Equinox-Flower/p/11572397.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有