UVA - 140 Bandwidth

原创 2016年08月29日 22:25:36

题目大意:给出字母间的连接关系,找到一个排列,使得字母间距离的最大值最小,如果有多个解输出字典序最小的。

解题思路:先排序一下保证答案相同时是字典序小的先,用 next_permutation 枚举所有排列。对于每个排列,我们找到两个有连接关系的字母距离最大的值,比较一下之前的最大值,储存较小的是答案。不难,主要是输入比较复杂,仔细一点就可以了。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
char s[50], str[50], as[50];
bool link[50][50];
int ans, tmp;
int main() {
    while (cin >> s) {
        if (s[0] == '#') break;
        memset(link, 0, sizeof(link));
        int a, b;
        int len = strlen(s);
        for (int i = 0; i < len; i++)
            if (s[i] == ':') {
                a = s[i-1] - 'A';
                for (int j = i+1; s[j] != ';' && j < len; j++) {
                    b = s[j] - 'A';
                    link[a][b] = 1;
                    link[b][a] = 1;
                }
            }
        int t = 0;
        for (int i = 0; i < len; i++)
            if (s[i] >= 'A' && s[i] <= 'Z') {
                int tag = 1;
                for (int j = 0; j < t; j++)
                    if (s[i] == str[j]) tag = 0;
                if (tag) str[t++] = s[i];
            }

        sort(str, str+t);
        ans = 100000000;
        do {
            tmp = 0;
            for (int i = 0; i < t; i++)
                for (int j = i+1; j < t; j++)
                    if (link[str[i]-'A'][str[j]-'A'] && j-i > tmp)
                        tmp = j - i;
            if (tmp < ans) {
                ans = tmp;
                for (int i = 0; i < t; i++)
                    as[i] = str[i];
            }
        } while (next_permutation(str, str+t));

        for (int i = 0; i < t; i++)
            printf("%c ", as[i]);
        printf("-> %d\n", ans);



    }
return 0; 
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

带宽(Bandwidth,UVa 140

本题用回溯法,将已经排列好的节点放在数组a中,并且记录下此时数组a的带宽值,这里的带宽值是作为函数参数传递的,即now_bandwith 如果a中的节点数等于输入的节点数,则此时为一个全排列,如果这...
  • qq_25974431
  • qq_25974431
  • 2017年07月07日 21:02
  • 76

UVA140 - Bandwidth (暴力dfs+排列+剪枝)

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem...
  • ACM_Fish
  • ACM_Fish
  • 2017年02月15日 21:09
  • 347

UVa 140 - Bandwidth

题目链接:UVa 140 - Bandwidth 这题目放在书上回溯那块,我就直接往回溯那块想,但是这不知道怎么做到字典序,感觉就是做到了也很麻烦。 在网上搜了搜题解,看见好多人都用next_pe...
  • fobdddf
  • fobdddf
  • 2014年02月24日 22:12
  • 404

uva 140 Bandwidth(全排列+递归)

快睡觉的时候1A的把序列全排列,递归暴力判断就ok啦,我改成对应的整数存了,a数组存的是所有的字符的排列, b数组存的是所有开始节点的排列,map[i][j]数组存的是i为起点,与j相邻 贴代码:...
  • sinat_22659021
  • sinat_22659021
  • 2015年07月28日 23:27
  • 965

UVa #140 Bandwidth (例题7-6)

这题理解起来也需要一点时间,其实也是一个枚举排列,只不过这次的限制条件没了,但引入了优化条件:让整个排列的带宽最小。 最简单的做法: 记录一共有多少个字母,然后枚举全排列。对于每个排列,算...
  • ACM_HKBU
  • ACM_HKBU
  • 2014年12月15日 17:46
  • 697

uva 140 bandwidth

我写成这样不忍直视。。。 大概是自己实现了我的第一个回溯法 #include #include #include using namespace std; int link[30][30]; int ...
  • qq_36107044
  • qq_36107044
  • 2016年10月15日 22:21
  • 90

UVa 140 Bandwidth

求全排列,这些排列中,有关系的元素下表差的最大值 中间的最小值 然而并没有用剪枝。。#include #include #include #include #include #includ...
  • m0_37253730
  • m0_37253730
  • 2017年03月16日 20:24
  • 91

UVA 140 Bandwidth (暴力)

题意:给最多8个点,输入是每个点与某几个点相邻,带宽的意思是重排列后每两个相邻的点的相隔距离,每个排列的带宽是排列中出现的最大带宽,要求输出带宽最小的排列并输出带宽 思路不难,就是输入处理起来比较麻烦...
  • KuHuaiShuXia
  • KuHuaiShuXia
  • 2016年05月28日 14:13
  • 195

带宽(Bandwidth,UVa 140)

原题链接 分析:简单DFS,根据关系图搜索满足题意的解,当遇到带宽大于已知最优解时进行回溯。 PS:开始做题时想当然地把关系数组c声明为c[27][27],WA了两次,真是教训啊。。。。 #in...
  • Shiki_05
  • Shiki_05
  • 2015年11月16日 23:45
  • 203

UVA 140 Bandwidth

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19399 题意:给出一个n个节点的图和一个节点的排列,定义...
  • chy20142109
  • chy20142109
  • 2016年04月21日 11:32
  • 133
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA - 140 Bandwidth
举报原因:
原因补充:

(最多只允许输入30个字)