UVA-818 Cutting Chains (位压缩+暴力搜索)

题目大意:一种环能打开和闭合。现在有n(1<=n<=15)个编号为1~n的环错综复杂的连接着,要打开一些环重新连接使这n个环能构成一条链,问最少需要打开几次环可达到目的?

题目分析:用二进制数表示要打开的环的集合,总共2^n种情形,枚举每一种情况。当把将要打开的环打开后,此环是孤立的,接下来就要判断剩下的环还与几个环连着,如果有的环仍然与两个以上的环连着则该方案不可行,不可能构成链;然后判断剩下的环有没有连成一个圈,如果有,则该方案不可行;最后,判断完前两个条件之后,所有的环都一定处于某条短链(长度小于等于n)中,只需判断一下短链的条数是否小于等于打开的环数加1,若不成立,则一定连不成一条链,若成立,则该方案可行。

代码如下:

# include<iostream>
# include<cstdio>
# include<set>
# include<cstring>
# include<algorithm>
using namespace std;

int n,ans,st[15],s[15],vis[15];

int bitCount(int sta)
{
    return sta==0?0:bitCount(sta>>1)+(sta&1);
}

void dfs(int u,int pre)
{
    for(int i=0;i<n;++i){
        if(i!=pre&&s[u]&(1<<i)){
            ++vis[i];
            if(vis[i]<2)
                dfs(i,u);
        }
    }
}

bool ok(int sta)
{
    for(int i=0;i<n;++i)
        s[i]=st[i];

    ///打开环
    for(int i=0;i<n;++i){
        if(sta&(1<<i)){
            s[i]=0;
            for(int j=0;j<n;++j){
                if(j!=i&&s[j]&(1<<i))
                    s[j]^=(1<<i);
            }
        }
    }

    ///判度
    for(int i=0;i<n;++i)
        if(!(sta&(1<<i))&&bitCount(s[i])>2)
            return false;

    ///判圈
    int link=0;
    memset(vis,0,sizeof(vis));
    for(int i=0;i<n;++i){
        if(!vis[i]&&!(sta&(1<<i))){
            ++link;
            ++vis[i];
            dfs(i,-1);
        }
    }
    for(int i=0;i<n;++i)
        if(vis[i]>=2)
            return false;

    ///判链
    if(link-1>bitCount(sta))
        return false;

    return true;
}

int main()
{
    int a,b,cas=0;
    while(scanf("%d",&n)&&n)
    {
        memset(st,0,sizeof(st));
        while(scanf("%d%d",&a,&b))
        {
            if(a==-1&&b==-1)
                break;
            st[a-1]|=(1<<(b-1));
            st[b-1]|=(1<<(a-1));
        }

        ans=n;
        int tot=1<<n;
        for(int i=0;i<tot;++i)
            if(ok(i))
                ans=min(ans,bitCount(i));

        printf("Set %d: Minimum links to open is %d\n",++cas,ans);
    }
    return 0;
}

  

时间: 2024-10-13 23:21:59

UVA-818 Cutting Chains (位压缩+暴力搜索)的相关文章

UVA - 818 Cutting Chains 暴力

题目大意:给出n个环(类似奥运五环的那种环),要求你打开其中的m个环,然后以这m个环为中介,使得所有的环能形成一条链 解题思路:暴力枚举,用二进制表示断开的环的位置和数量. 断开环后,和该环相连都断开了,也就是该环变成了一个孤立的环 接着判断一下非断开的环能否连成一个环,如果能连成一个环,那就不可能通过m个环当中介连成一条链 还得判断一下非断开的环的度,如果度超过2,也不能变成一条链 #include<cstdio> #include<cstring> #include<al

UVa 818 Cutting Chains 题解

难度:β 建议用时:40 min 这题应该有迭代加深搜索的解法的,但我参考网友做法,用暴力枚举法. 大致思路是:枚举圆环的每种开闭状态,统计符合要求的最小的打开的圆环的数量. 要判断打开圆环的某一种方法是否符合要求,容易想到的一个是先判断除去这些已打开的圆环外的闭合圆环有没有组成一个环. 如果还有环,那么无论把打开的圆环怎样重新连城一条链套回去,都不能消除环,而题目要求我们够一条链.所以如果任然存在环的方法是不行的. 0000   0 (此时还有一个环没打开,不能组成链) 0    0 0000

UVA 818 Cutting Chains (DFS)

What a find! Anna Locke has just bought several links of chain some of which may be connected. They are made from zorkium, a material that was frequently used to manufacture jewelry in the last century, but is not used for that purpose anymore. It ha

UVA 818 Cutting Chains

题意就是给一张无向图,去掉某些结点,然后连成一条链,问最少去掉几个结点. n很小n<=15,所以直接枚举2^15个状态就行啦. 链的条件是1.无环,2.没有度大于2的点,3.把n个散链连起来需要n-1次拼接,去掉的结点数>=n-1. #include<bits/stdc++.h> using namespace std; const int maxn = 15; int G[maxn][maxn]; int n; int c[maxn]; bool dfs(int u,int s,

uva 818(dfs+图+状态压缩)

题意:有n个环,编号从1到n,给出了一些环环相扣的情况,比如给a和b表示a和b两个环的扣在一起的,每个环都是可以打开的,问最少打开多少个环,然后再扣好,可以让所有的环成为一条链. 题解:状态压缩把所有的打开环的情况枚举出来,然后拿去判断是否成立,更新打开环后的图g[i][j],和每个点的度数,不成立有三种情况,1.计算没有打开的环的度数,如果大于2说明不会有链,2.把没有打开环拿去dfs,访问过就vis[i]++,如果vis[i]>=2说明存在环,3.如果打开的环数num + 1小于链的数量,说

UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)

题目链接:uva 1252 题意: 有n个长度为m的二进制串,每个都是不同的. 为了把所有字符串区分开,你可以询问,每次可以问某位上是0还是1. 问最少提问次数,可以把所有字符串区分开来. 思路来源于:点击打开链接 思路: m很小,可以考虑状态压缩. dp[s1][s2]表示询问的状态为s1时,此时能猜到状态包含s2时最小需要的步数. 当询问的几位=s2的二进制串小于2时就能区分出来了,dp[s1][s2]=0: 不能区分则再询问一次,s1|=(1<<k),如果问某位为0,则s2不变,问某位为

UVA 10003 Cutting Sticks 区间DP+记忆化搜索

UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的长度L,第二行是切割点的个数n,接下来的n行是切割点在木棍上的坐标. 输出切割木棍的最小费用 前话-区间dp简单入门 区间dp的入门下面博客写的非常好,我就是看的他们博客学会的,入门简单,以后的应用就得靠自己了. https://blog.csdn.net/qq_41661809/article/d

uva 818 (位运算 + 判环)

 Cutting Chains  What a find! Anna Locke has just bought several links of chain some of which may be connected. They are made from zorkium, a material that was frequently used to manufacture jewelry in the last century, but is not used for that purpo

ACM 暴力搜索题 题目整理

UVa 129 Krypton Factor 注意输出格式,比较坑爹. 每次要进行处理去掉容易的串,统计困难串的个数. #include<iostream> #include<vector> #include<cmath> #include<map> #include<algorithm> #include<cstring> #include<cstdio> #include<cstdlib> #include