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; 
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

uva 140 Bandwidth 带宽

题目大意:

Bandwidth(UVA - 140)全排列

一、题目大意: 列出每个字母及与该字母相连的字母,通过将所有字母排序,求出每个字母与其相连字母的最大值,并求出这些这些最大值中的最小值。 二、题目求解 题目意思很直观。但是工具用...

UVA 140 Bandwidth

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19399 题意:给出一个n个节点的图和一个节点的排列,定义...

UVa #140 Bandwidth (例题7-6)

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

[暴力搜索]Bandwidth UVA140

用回溯可以解决这道题目,但是因为节点数较少只有8个,因此可以使用暴力搜索。更加简单。...

uva 140 Bandwidth

一道回溯题目,用回溯法递归枚举肯能的序列,并在每一个递归的位置算出当前序列里面的边的长度,如果有一条边的长度已经大于等于当前的全局最小边长,就可以进行回溯了,因为这个边长是小于等于以当前序列为前缀的一...

uva - 140 - Bandwidth(模拟 + 下一个排列 + 图)

题目大意: 带宽问题,输入一个图,对这个图的结点进行排列,每一个结点的宽度就是这个结点到它所连接的结点的最大距离。一个排列宽度就是所有结点宽度的最大值。一个图的(最大)最小带宽就是所有排列的中的那个...

UVA140 - Bandwidth

Bandwidth Time limit: 3.000 seconds Given a graph (V,E) where V is a set of nodes and E is a set of...

UVA 140 Bandwidth (暴力)

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

Uva 140 Bandwidth(回溯法+剪枝)

Uva 140 Bandwidth(回溯法+剪枝)附测试用例
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA - 140 Bandwidth
举报原因:
原因补充:

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