题目链接:https://vjudge.net/problem/UVA-140

题解:这道题利用全排函数即可解决,但是这道题技巧性强,稍微不注意就会超时,一开始没有想起全排函数,自己写回溯全排超时了,主要问题出在:1、递归过程中疯狂判断最小带宽,循环太多了。2、处理原字符串的方法太LOW了。在借鉴了紫书思路的之后写出了AC代码如下:

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define MAXN 30
using namespace std;
typedef long long ll; vector<int> u;
vector<int> v; int main(void){
char s[];
while(scanf("%s",s) == && s[] != '#'){
u.clear();
v.clear();
int len = strlen(s);
int p = ,q = ;
int n = ;
int id[];
char letter[MAXN];
for(char i = 'A';i<='Z';i++){
if(strchr(s,i) != NULL){
id[i] = n++;
letter[id[i]] = i;
}
}
for(;;){
if(p<len && q < len){
while(){
if(s[p] == ':'){
break;
}
p++;
if(p == len){
break;
}
}
while(){
if(s[q] == ';'){
break;
}
q++;
if(q == len){
break;
}
}
for(int i = p+;i<q;i++){
u.push_back(id[s[p - ]]);
v.push_back(id[s[i]]);
}
}
else
break;
p++;q++;
}
int P[MAXN],BESTP[MAXN];
int pos[MAXN];
int best = n;
for(int i = ;i<n;i++){
P[i] = i;
}
do{
for(int i = ;i<n;i++){
pos[P[i]] = i;
}
int bandwith = ;
for(int i = ;i<u.size();i++){
bandwith = max(bandwith,abs(pos[u[i]]-pos[v[i]]));
}
if(bandwith < best){
best = bandwith;
memcpy(BESTP,P,sizeof(P));
}
}while(next_permutation(P,P+n));
for(int i = ; i < n; i++) printf("%c ", letter[BESTP[i]]);
printf("-> %d\n", best);
}
return ;
}

超时代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<cmath>
#define MAXN 30
using namespace std;
typedef long long ll;
int mmin;
int maxalp;
int nowMin;
int graph[MAXN][MAXN];
int nowbox[MAXN];
int ansbox[MAXN];
void findNiceList(int cur){
if(cur - == maxalp){
int ok = ;
int nowbig;
int big1;
int big = ;
for(int i =;i<cur;i++){
big1 = ;
if(!ok){
break;
}
int nowchar = nowbox[i];
for(int j = ;j<=maxalp;j++){
if(graph[nowchar][j] == ){
nowbig = abs((find(nowbox,nowbox+cur,j) - nowbox) - i);
if(nowbig > big1){
big1 = nowbig;
}
if(big1 >= mmin){
ok = ;
break;
}
}
}
if(big1 > big){
big = big1;
}
}
nowMin = big;
if(nowMin < mmin && ok){
for(int i = ;i<=maxalp;i++){
ansbox[i] = nowbox[i];
mmin = nowMin;
}
}
}
else{
for(int i = ;i<=maxalp;i++){
int ok = ;
for(int j = ;j<cur;j++){
if(nowbox[j] == i){
ok = ;
break;
}
}
if(ok){
nowbox[cur] = i;
findNiceList(cur+);
}
}
}
} /*void graphprint(void){
for(int i = 0;i<=maxalp;i++){
printf("%c:",'A'+i);
for(int j = 0; j<MAXN;j++){
if(graph[i][j] == 1){
printf("%c ",j+'A');
}
}
printf("\n");
}
}*/ int main(void){
string inistr;
const string endstr = "#";
while((cin >> inistr) && inistr != endstr){
memset(graph,-,sizeof(graph));
int len = inistr.size();
maxalp = -;
mmin = ;
nowMin = ;
for(int i = ;i < len;i++){
if(inistr[i] <= 'Z' && inistr[i] >='A'){
if(inistr[i] - 'A' > maxalp){
maxalp = inistr[i] - 'A';
}
}
if(i+ == len || inistr[i+] == ';'){
int okindex;
for(int m = i - ;m>=;m--){
if(inistr[m] == ':'){
okindex = m;
break;
}
}
for(int m = okindex + ;m<=i;m++){
graph[inistr[okindex - ] - 'A'][inistr[m] - 'A'] = ;
graph[inistr[m] - 'A'][inistr[okindex - ] - 'A'] = ;
}
}
}
findNiceList();
for(int i = ;i<=maxalp;i++){
printf("%c ",ansbox[i] + 'A');
}
printf("-> ");
printf("%d\n",mmin);
}
return ;
}

假回溯-uva140带宽的更多相关文章

  1. 递归回溯 UVa140 Bandwidth宽带

    本题题意:寻找一个排列,在此排序中,带宽的长度最小(带宽是指:任意一点v与其距离最远的且与v有边相连的顶点与v的距离的最大值),若有多个,按照字典序输出最小的哪一个. 解题思路: 方法一:由于题目说结 ...

  2. 7_6 带宽(UVa140)<回溯法:最优性剪枝>

    给定一个图(V,E),其中V为顶点的集合,E为边的集合,属于VxV.给定V中元素的一种排序,那么顶点v的带宽定义如下:在当前给定的排序中,与v距离最远的且与v有边相连的顶点与v的距离.给定排序的带宽定 ...

  3. UVA-140 Bandwidth (回溯+剪枝)

    题目大意:求一个使带宽最小的排列和最小带宽.带宽是指一个字母到其相邻字母的距离最大值. 题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个.一.当前解不如最优解优时,减去:二.预测的理想解不必最 ...

  4. UVA 140 Brandwidth 带宽 (dfs回溯)

    看到next_permutation好像也能过╮(╯▽╰)╭ 这题学习点: 1.建图做映射 2.通过定序枚举保证字典序最小 3.strtok,sscanf,strchr等函数又复习了一遍,尽管程序中没 ...

  5. uva140 - Bandwidth

    Bandwidth Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an orderi ...

  6. FMS+NGINX打造高带宽利用率的流媒体(音频+视频)环境

    fms自身已经拥有了httpd,用来给客户端访问用,例如通过http的音频播放.众所周知,非专业的httpd自然有不专业之处,例如我遇到的情况就是经常http服务假死,或者在访问量庞大的时候会无缘无故 ...

  7. uva140

    全排列回溯剪枝. 题目数据很水.记录当前最小带宽,边回溯边计算当前序列最大的距离(也就是带宽),如果当前带宽超过了当前的最小带宽就剪枝. 注意下,数据读入时的字符串处理. AC代码 #include& ...

  8. 护航者,腾讯云: 2017年度游戏行业DDoS态势报告—回溯与前瞻

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯游戏云 前言 自14年开始,全球DDoS攻击持续爆发,攻击峰值不断创记录.2017年,这种依靠超大流量不断冲击服务器和带宽造成业务 ...

  9. UVa140 Bandwidth 小剪枝+双射小技巧+枚举全排列+字符串的小处理

    给出一个图,找出其中的最小带宽的排列.具体要求见传送门:UVa140 这题有些小技巧可以简化代码的编写. 本题的实现参考了刘汝佳老师的源码,的确给了我许多启发,感谢刘老师. 思路: 建立双射关系:从字 ...

随机推荐

  1. [转]VC++获取文件大小集锦

    方法一: WIN32_FIND_DATA fileInfo; HANDLE hFind; DWORD fileSize; const char *fileName = 文件的路径及名字; hFind ...

  2. PAT——1036. 跟奥巴马一起编程

    美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正 ...

  3. ansible copy 模块 changed false 没有变化

    在分发配置文件的时候,我用命令ansible big_hosthub  -m copy -a "src=/home/clouder/deploy-conf.xml dest=/home/cl ...

  4. Mac下python3配置Sklearn

    服务器要有Python 环境 ,也要有Python运行的依赖包,Java与Python使用Process进程进行通讯. 安装homebrew /usr/bin/ruby -e "$(curl ...

  5. CCF认证201803-2 碰撞的小球 java代码实现。

    问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒. 当小球到达线 ...

  6. Oracle 数据库备份和恢复配置

    可能的失败及其解决方法 失败类型 我们坑你遇到的失败或错误分为两大类:物理和逻辑.物理错误一般是硬件错误或使用数据库的应用程序中的软件错误,而逻辑错误一般在终端用户级别(数据库用户和管理员). 按从轻 ...

  7. [iOS]UIInterpolatingMotionEffect重力视觉差

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  8. webStorm安装以及集成git使用!

    一:安装webstorm 百度网盘地址:https://pan.baidu.com/s/1K96mg7WYHc6X3odtk7_f2g 密码:2cgd   二:破解webstorm 1:选择liste ...

  9. 【模板】区间dp

    有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子合并为1堆.在合并的过程中只能每次将相邻的两堆石子合并,每次合并的花费为这两堆石子之和,求合并成1堆的最小花费. dp[i][j]表示将区间[i ...

  10. HCDA day1

    OSI有几层: OSI将计算机网络体系结构(architecture)划分为以下七层: 图1.OSI模型 物理层: 将数据转换为可通过物理介质传送的电子信号 相当于邮局中的搬运工人. 物理层(Phys ...