UVA - 818 Cutting Chains 暴力

题目大意:给出n个环(类似奥运五环的那种环),要求你打开其中的m个环,然后以这m个环为中介,使得所有的环能形成一条链

解题思路:暴力枚举,用二进制表示断开的环的位置和数量。

断开环后,和该环相连都断开了,也就是该环变成了一个孤立的环

接着判断一下非断开的环能否连成一个环,如果能连成一个环,那就不可能通过m个环当中介连成一条链

还得判断一下非断开的环的度,如果度超过2,也不能变成一条链

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 20
int g[maxn][maxn], m[maxn][maxn], vis[maxn], n, ans;

int bitcount(int s) {
    return s ? s % 2 + bitcount(s / 2): 0;
}

void dfs(int cur, int f) {
    for(int i = 0; i < n; i++)
        if(i != f && m[cur][i]) {
            vis[i]++;
            if(vis[i] < 2)
                dfs(i,cur);
        }
}

bool judge(int S) {
    int d[maxn], broke = 0, link = 0;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            m[i][j] = g[i][j];

    memset(vis,0,sizeof(vis));
    memset(d,0,sizeof(d));
    //把和broke的珠子相连的线段去掉
    for(int i = 0; i < n; i++)
        if((1 << i) & S) {
            broke++;
            for(int j = 0; j < n; j++)
                m[i][j] = m[j][i] = 0;
        }
    //纪录一下不是broke的珠子的度数
    for(int i = 0; i < n; i++)
        if(!((1 << i) & S)) {
            for(int j = 0; j < n; j++)
                if(m[i][j])
                    d[i]++;
            if(d[i] > 2)
                return false;
        }
    //处理各个串是否会形成环和一共有几个串
    for(int i = 0; i < n; i++)
        if(!vis[i] && !((1 << i) & S)) {
            link++;
            vis[i]++;
            dfs(i,-1);
        }

    for(int i = 0; i < n; i++)
        if(vis[i] >= 2)
            return false;
    if(link - 1 > broke)
        return false;
    return true;
}

void solve() {
    ans = 50;
    int End = (1 << n);
    for(int i = 0; i < End; i++)
        if(judge(i))
            ans = min(ans, bitcount(i));
}

int main() {
    int cas = 1;
    while(scanf("%d", &n) == 1 && n) {
        int x, y;
        memset(g,0,sizeof(g));
        while(scanf("%d%d", &x, &y)) {
            if(x == -1 && y == -1)
                break;
            g[x - 1][y - 1] = g[y - 1][x - 1] = 1;
        }
        solve();
        printf("Set %d: Minimum links to open is %d\n", cas++, ans);
    }
    return 0;
}
时间: 2024-10-10 23:54:40

UVA - 818 Cutting Chains 暴力的相关文章

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 10003 Cutting Sticks 简单区间dp

// uva 10003 Cutting Sticks 区间dp // 经典的区间dp // dp(i,j)表示切割小木棍i-j所需要的最小花费 // 则状态转移为dp(i,j) = min{dp(i,k) + dp(k,j) + a[j]-a[i]) // 其中k>i && k<j // a[j] - a[i] 为第一刀切割的代价 // a[0] = 0,a[n+1] = L; // dp数组初始化的时候dp[i][i+1]的值为 0,这表示 // 每一段都已经是切割了的,不

uva 467 - Synching Signals(暴力+数学)

题目连接:uva 467 - Synching Signals 题目大意:有n个红绿灯,给出红灯的时间t,那么该灯从0时刻开始就以2*t为周期绿黄红三灯交替,时间分别为t-5,5,t.问所这n个等从第一变为有一个灯不为绿灯开始,要多久才能变成所有的灯刚好都为绿灯.时间超过1小时输出unable to synch after one hour. 解题思路:一小时才3600秒,枚举秒数判断即可. #include <cstdio> #include <cstring> #include

uva 618 - Doing Windows(暴力+数学)

题目链接:uva 618 - Doing Windows 题目大意:给出电脑桌面的大小W和H,现在在桌面上有4个窗口,给出窗口的初始大小,问说能不能通过调整各个窗口的大小(长宽比例不能变)使得4个屏幕刚好占满整个屏幕,并且互相不覆盖. 解题思路:其实可以直接暴力出所有情况,不过细节比较多,而且要考虑所有的细节. 我的做法的是先将4个窗口缩小至最小的状态,然后枚举左下角的窗口, 有四种可能 蓝色部分为另外枚举的窗口,3,4种情况要分别保证说长.宽相等,然后S部分就是子问题. 所以用一个二进制数来表

uva 10003 Cutting Sticks (DP)

uva 10003 Cutting Sticks Description 你的任务是替一家叫Analog Cutting Machinery (ACM)的公司切割木棍.切割木棍的成本是根据木棍的长度而定.而且切割木棍的时候每次只切一段.很显然的,不同切割的顺序会有不同的成本.例如:有一根长10公尺的木棍必须在第2.4.7公尺的地方切割.这个时候就有几种选择了.你可以选择先切2公尺的地方,然后切4公尺的地方,最后切7公尺的地方.这样的选择其成本为:10+8+6=24.因为第一次切时木棍长10公尺,

UVA 10003 Cutting Sticks(区间dp)

Description  Cutting Sticks  You have to cut a wood stick into pieces. The most affordable company, The Analog Cutting Machinery, Inc. (ACM), charges money according to the length of the stick being cut. Their procedure of work requires that they onl

uva 565 - Pizza Anyone?(暴力枚举 + 二进制)

题目:uva 565 - Pizza Anyone?(暴力枚举 + 二进制) 题目大意:题目是说有一个人要帮他的朋友们定批萨,然后每个朋友都有自己的口味要求,问能不能定一个批萨然后满足每个朋友的至少一个要求. 能就输出所定批萨里面加的东西,,输出要求按字典序: 不能就输出:No pizza can satisfy these requests. 解题思路:这题里面有16种材料,每种材料只有取与不取的可能,这样就有 2^16 种( 0 - 2^16 - 1),枚举出每种情况然后在分别看是否能满足每