假回溯-uva140带宽
题目链接: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带宽的更多相关文章
- 递归回溯 UVa140 Bandwidth宽带
本题题意:寻找一个排列,在此排序中,带宽的长度最小(带宽是指:任意一点v与其距离最远的且与v有边相连的顶点与v的距离的最大值),若有多个,按照字典序输出最小的哪一个. 解题思路: 方法一:由于题目说结 ...
- 7_6 带宽(UVa140)<回溯法:最优性剪枝>
给定一个图(V,E),其中V为顶点的集合,E为边的集合,属于VxV.给定V中元素的一种排序,那么顶点v的带宽定义如下:在当前给定的排序中,与v距离最远的且与v有边相连的顶点与v的距离.给定排序的带宽定 ...
- UVA-140 Bandwidth (回溯+剪枝)
题目大意:求一个使带宽最小的排列和最小带宽.带宽是指一个字母到其相邻字母的距离最大值. 题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个.一.当前解不如最优解优时,减去:二.预测的理想解不必最 ...
- UVA 140 Brandwidth 带宽 (dfs回溯)
看到next_permutation好像也能过╮(╯▽╰)╭ 这题学习点: 1.建图做映射 2.通过定序枚举保证字典序最小 3.strtok,sscanf,strchr等函数又复习了一遍,尽管程序中没 ...
- 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 ...
- FMS+NGINX打造高带宽利用率的流媒体(音频+视频)环境
fms自身已经拥有了httpd,用来给客户端访问用,例如通过http的音频播放.众所周知,非专业的httpd自然有不专业之处,例如我遇到的情况就是经常http服务假死,或者在访问量庞大的时候会无缘无故 ...
- uva140
全排列回溯剪枝. 题目数据很水.记录当前最小带宽,边回溯边计算当前序列最大的距离(也就是带宽),如果当前带宽超过了当前的最小带宽就剪枝. 注意下,数据读入时的字符串处理. AC代码 #include& ...
- 护航者,腾讯云: 2017年度游戏行业DDoS态势报告—回溯与前瞻
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯游戏云 前言 自14年开始,全球DDoS攻击持续爆发,攻击峰值不断创记录.2017年,这种依靠超大流量不断冲击服务器和带宽造成业务 ...
- UVa140 Bandwidth 小剪枝+双射小技巧+枚举全排列+字符串的小处理
给出一个图,找出其中的最小带宽的排列.具体要求见传送门:UVa140 这题有些小技巧可以简化代码的编写. 本题的实现参考了刘汝佳老师的源码,的确给了我许多启发,感谢刘老师. 思路: 建立双射关系:从字 ...
随机推荐
- [NOIP2016]换教室(概率期望$DP$)
其实吧我老早就把这题切了--因为说实话,这道题确实不难啊--李云龙:比他娘的状压DP简单多了 今天我翻以前在Luogu上写的题解时,突然发现放错代码了,然后被一堆人\(hack\)--蓝瘦啊\(ORZ ...
- Git--查看,删除,添加远程分支
1. 查看远程分支: $ git branch -a 2. 删除远程分支: $ git push origin --delete <branch name> 或者 git push --d ...
- 【腾讯敏捷转型NO.1】敏捷是什么鬼?
“敏捷是什么鬼” 最近对外进行<腾讯产品敏捷研发体系>授课的时候,我经常可以从参课学员的眼睛里找到这句话. 通常我会鼓励大家,说:“告诉大家一个好消息,你们今天所有的疑问都是有答案的,唯一 ...
- Java中的引用:强引用、软引用、弱引用、幻象引用(虚引用)
Java语言中,除了原始数据类型的变量(八大基本数据类型),其他都是引用类型,指向各种不同的对象. 理解引用对于我们掌握Java对象生命周期和JVM内部相关机制都是有帮助的. 不同的应用类型,不同之处 ...
- Vue聊天框默认滚动到底部
功能场景 在开发中,我们总能遇到某些场景需要运用到聊天框,比如客服对话.如果你不是一名开发人员,可能你在使用QQ或者聊天工具的时候并没有注意到,当你发出一条消息的时候,窗体会默认滚动到最底部,让用户可 ...
- Python 基础 函数
python 什么是函数 Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数,可以直接调用. python 函数的调用 Python内置了很多有用的函数,我们可以直接调用. 要调用 ...
- C# 数组集合分页 Skip Take
var input=new input(); var personList= new List<Person>(); //一个查询集合 var Total = personList.Cou ...
- jquery里遍历普通数组和多维数组的方法及实例
jquery里遍历数组用的是$.each,下面站长给大家几个具体的实例: 实例1.遍历一个普通的一维数组: 1 2 3 4 5 6 7 8 <script> //声明数据有下面两种方式 / ...
- MongoDB DBA 实践6-----MongoDB的分片集群部署
一.分片 MongoDB使用分片技术来支持大数据集和高吞吐量操作. 1.分片目的 对于单台数据库服务器,庞大的数据量及高吞吐量的应用程序对它而言无疑是个巨大的挑战.频繁的CRUD操作能够耗尽服务器的C ...
- Spark SQL join的三种实现方式
引言 join是SQL中的常用操作,良好的表结构能够将数据分散到不同的表中,使其符合某种规范(mysql三大范式),可以最大程度的减少数据冗余,更新容错等,而建立表和表之间关系的最佳方式就是join操 ...