题目链接: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. QTP基本方法3-----截屏

    1.桌面截屏 Desktop.captureBitMap  path[,bolean] path:保存路径,可选择绝对路径或相对路径 相对路径是保存在脚本保存的目录下编号最大的res目录下. bole ...

  2. 一种基于openflow的虚拟化层软件flowvisor的API测试

    注明:本文并不对openflow进行分析,本人也是略略知道这个概念,对flowvisor也只是对其API有所测试,更深的源码并未涉及,只是希望该文能对以后的flowvisor研究者提供些许帮助. 一: ...

  3. Oracle数据库常用命令(持续更新)

    1. 查询当前用户所有的表 select * from user_tables; 2. 查询当前用户能访问的表 select * from all_tables; 3. 获取表字段 select * ...

  4. POJ 3762 The Bonus Salary!(最小K覆盖)

    POJ 3762 The Bonus Salary! 题目链接 题意:给定一些任务.每一个任务有一个时间,有k天.一个时间仅仅能运行一个任务,每一个任务有一个价值.问怎么安排能得到最多价值 思路:典型 ...

  5. git did not exit cleanly (exit code 1)

    git pull的时候报如下错误: error: Your local changes to the following files would be overwritten by merge: 文件 ...

  6. MySQL导出表结构方法

    方法一: 以下用的是Navicat Premium,可以换成任意图形化客户端 SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHAR ...

  7. 使用interface与类型诊断机制判断一个类型是否实现了某个方法

    Golang中的interface通常用来定义接口,在接口里提供一些方法,其他类型可以实现(implement)这些方法,通过将接口指针指向不同的类型实例实现多态(polymorphism),这是in ...

  8. i2c子系统

    linux内核的I2C驱动框架总览(1)I2C驱动框架的主要目标是:让驱动开发者可以在内核中方便的添加自己的I2C设备的驱动程序,从而可以更容易的在linux下驱动自己的I2C接口硬件(2)源码中I2 ...

  9. 树概念及使用connect by进行级联查询

    树 树,大家都见过,以这种形式的数据关系,就是树.下面看一张图,了解什么是根节点(树干).节点或分叉.叶(叶节点) connect by 级联查询 connect by可以用于级联查询,常用于对具有树 ...

  10. async await循环请求

    var sleep = function (item,time) { return new Promise(function (resolve, reject) { setTimeout(functi ...