关闭

例题 7-6 UVA - 140 Bandwidth 带宽 (全排列暴力)

标签: c语言uva
352人阅读 评论(0) 收藏 举报
分类:

UVA 蹦了  不知道能不能过 先写上在说,不对在改吧!

思路很简单:

直接从输入中建立出一张图,然后全排列枚举图,在每一个全排列中遍历带宽

最后更新答案!

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<cctype>
using namespace std;
const int maxn = 200 + 10;
const int INF = 1e9;
vector<int>v[30];
char s[maxn];
int a[30];
int main(){
    while(scanf("%s",s+1) == 1 && s[1] != '#'){
        s[0] = ';';
        int len = strlen(s);
        s[len++] = ';';
        s[len] = 0;
        for (int i = 0; i < 26; ++i)v[i].clear();
        for (int i = 0; i < len; ++i){
            if (s[i] == ';'){
                int u = s[i+1]-'A',j;
                for (j = i + 3; j < len && s[j] != ';'; ++j){
                    int vv = s[j] - 'A';
                    v[u].push_back(vv);
                    v[vv].push_back(u);
                }
                i = j - 1;
            }
        }
        int cnt = 0;
        for (int i = 0; i < 26; ++i)if (!v[i].empty())a[cnt++] = i;
        sort(a,a+cnt);
        int aa[10];
        int ans = INF;
        do{
            int pos[10];
            int band = 0;
            for (int i = 0; i < cnt; ++i)pos[a[i]] = i;
            for (int i = 0; i < cnt; ++i){
                int u = a[i];
                for (int j = 0; j < v[u].size(); ++j){
                    band = max(band,abs(pos[v[u][j]]-pos[u]));
                }
            }
            if (band < ans){
                ans=band;
                memcpy(aa,a,sizeof(int)*10);
            }
        }while(next_permutation(a,a+cnt));
        for (int i = 0; i < cnt; ++i)printf("%c ",aa[i] + 'A');
        printf("-> %d\n",ans);
    }

    return 0;
}


0
0
查看评论

带宽(Bandwidth,UVa 140

本题用回溯法,将已经排列好的节点放在数组a中,并且记录下此时数组a的带宽值,这里的带宽值是作为函数参数传递的,即now_bandwith 如果a中的节点数等于输入的节点数,则此时为一个全排列,如果这个排列的带宽值比已经保存的最小带宽值小,那么保存该排列和带宽值即可。 为了优化代码,这里用到了剪枝...
  • qq_25974431
  • qq_25974431
  • 2017-07-07 21:02
  • 76

UVa 140 - Bandwidth

题目链接:UVa 140 - Bandwidth 这题目放在书上回溯那块,我就直接往回溯那块想,但是这不知道怎么做到字典序,感觉就是做到了也很麻烦。 在网上搜了搜题解,看见好多人都用next_permutation做到的,看起来也没有超时。当然用这个函数做到字典序就比较简单了。 开始WA了几次...
  • fobdddf
  • fobdddf
  • 2014-02-24 22:12
  • 404

例题7-6 带宽(Bandwidth, UVa 140)

注意要先为出现的节点进行编号。而且还要按字典序而非出现顺序。 dfs枚举排列。#include #include #include #include #include #include #include #include #include #include #include...
  • chcnsn
  • chcnsn
  • 2017-09-30 11:00
  • 90

UVa #140 Bandwidth (例题7-6)

这题理解起来也需要一点时间,其实也是一个枚举排列,只不过这次的限制条件没了,但引入了优化条件:让整个排列的带宽最小。 最简单的做法: 记录一共有多少个字母,然后枚举全排列。对于每个排列,算出带宽,找出最小的排列 改进: 因为没有了限制条件(比如八皇后中的不能相互攻击、例题7-...
  • ACM_HKBU
  • ACM_HKBU
  • 2014-12-15 17:46
  • 692

UVa 140 Bandwidth 例题7-6

/枚举全排列对每个排列的每个节点求出与其相邻的节点中最大的带宽,所有节点最大的带宽就是这个排列的带宽,枚举全排列找到最小的带宽*函数原型:extern char *strchr(char *str,char character) 参数说明:str为一个字符串的指针,character为一个待查找字符...
  • loveyou11111111
  • loveyou11111111
  • 2015-08-23 19:32
  • 210

UVA - 140(Bandwidth )(全排列+暴力)

题意: 给出一个n(n<=8)个节点的图G和一个节点的排列,定义节点i的带宽为相邻接点在排列中的最远距离。 分析:用全排列暴力做,先找出给出的序列中的所有字母,我用的set存贮(可以去掉重复的字母),这就是需要进行全排列的字符串,在每一个排列里找到带宽,然后输出其中的最小值即可。做的时候总...
  • zfldongcidaci
  • zfldongcidaci
  • 2017-07-25 19:33
  • 58

Bandwidth UVA - 140(全排列 暴力)

题目描述:给定一个字符串说明各字母之间相连的情况,每个字母的距离为到与它相连的字母中的最大距离,对这些字母求一个序列,使得最大距离最小。 思路:全排列么枚举,求出每种情况的最大距离取最小值即可。比赛时脑残读错题意了,以为排列顺序只能按边走结果dfs了半天都推不出样例中的3。改了一个小时反应过来,又删...
  • smwqd_yehua_cx
  • smwqd_yehua_cx
  • 2017-07-25 16:41
  • 105

紫书搜索 例题7-6 UVA - 140 Bandwidth

题目链接:https://vjudge.net/problem/UVA-140题意:题解:代码:#include <bits/stdc++.h> using namespace std; typedef long long ll; #define MS(a) memset(a,0,siz...
  • yxg_123
  • yxg_123
  • 2017-03-12 13:49
  • 72

带宽(Bandwidth,UVa 140)

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

uva 140 Bandwidth 带宽

题目大意:
  • u013588639
  • u013588639
  • 2014-10-27 18:19
  • 446
    个人资料
    • 访问:195128次
    • 积分:7751
    • 等级:
    • 排名:第3249名
    • 原创:602篇
    • 转载:2篇
    • 译文:0篇
    • 评论:36条
    文章分类
    最新评论