Uva140 Bandwidth 全排列+生成测试法+剪枝
参考过仰望高端玩家的小清新的代码。。。
思路:1.按字典序对输入的字符串抽取字符,id[字母]=编号,id[编号]=字母,形成双射
2.邻接表用两个vector存储,存储相邻关系
3.先尝试字母编号字典序最小的排列,此为next_permutation的最上排列
4.在最理想的情况下都不能得到比当前最优解更好的方案,则应当剪枝(prune)
5.memcpy(),strchr()方法来自于库函数
测试集:
Input:
A:FB;B:GC;D:GC;F:AGH;E:HD;
#
Oput:
A B C F G D H E -> 3
//id[]输入字母的编号
//p[i]排列的字母编号 do{}先执行最小字典序的排列 #include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std; const int maxn=,inf=0x7fffffff;
char letter[maxn], s[];//字母,输入序列
int id[]; //字母的编号
int p[maxn]; //全排列的遍历数组 ,存储的是每个字母的编号
int pos[maxn];//记录每个字母的位置,避免频繁使用strchr int main(){
while(scanf(" %s",&s),s[]!='#'){
int len=strlen(s),n=;
for(char ch='A';ch<='Z';ch++)if(strchr(s,ch)!=NULL){
letter[n]=ch;
id[ch]=n++;
}
vector<int> u,v;
for(int i=;i<len;i++){
int t=i;//记录起始节点
i+=;
while(i<len && s[i]!=';'){
u.push_back(id[s[t]]);//加入起始节点
v.push_back(id[s[i]]);//加入起始节点的相邻节点
i++;
}
}
//遍历+剪枝
int bandwidth=,res=inf;
int bestP[maxn];//存储最终结果
for(int i=;i<n;i++)p[i]=i;
do{
bandwidth=;//初始化别忘了
for(int i=;i<n;i++)pos[p[i]]=i;//记录编号为pi的节点的位置
for(int i=;i<u.size();i++){
bandwidth=max(bandwidth,abs(pos[u[i]]-pos[v[i]]));
if(bandwidth>=res)break;//剪枝
}
if(bandwidth<res){
memcpy(bestP,p,sizeof(p));//memcpy比较快
res=bandwidth;
}
}while(next_permutation(p,p+n));
for(int i=;i<n;i++)printf("%c ",letter[bestP[i]]);
printf("-> %d\n",res);
}
}
Uva140 Bandwidth 全排列+生成测试法+剪枝的更多相关文章
- UVa140 Bandwidth 小剪枝+双射小技巧+枚举全排列+字符串的小处理
给出一个图,找出其中的最小带宽的排列.具体要求见传送门:UVa140 这题有些小技巧可以简化代码的编写. 本题的实现参考了刘汝佳老师的源码,的确给了我许多启发,感谢刘老师. 思路: 建立双射关系:从字 ...
- UVa140 Bandwidth 【最优性剪枝】
题目链接:https://vjudge.net/contest/210334#problem/F 转载于:https://www.cnblogs.com/luruiyuan/p/5847706.ht ...
- UVA-140 Bandwidth (回溯+剪枝)
题目大意:求一个使带宽最小的排列和最小带宽.带宽是指一个字母到其相邻字母的距离最大值. 题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个.一.当前解不如最优解优时,减去:二.预测的理想解不必最 ...
- 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 ...
- 【STL】全排列生成算法:next_permutation
C++/STL中定义的next_permutation和prev_permutation函数是非常灵活且高效的一种方法,它被广泛的应用于为指定序列生成不同的排列. next_permutation函数 ...
- HDOJ-ACM1016(JAVA) 字典序全排列,并剪枝
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5576273.html 题意: 一个环是用图中所示的n个圆组成的.把自然数1.2.…….n分别放入每个圆中,并在相邻 ...
- 递归回溯 UVa140 Bandwidth宽带
本题题意:寻找一个排列,在此排序中,带宽的长度最小(带宽是指:任意一点v与其距离最远的且与v有边相连的顶点与v的距离的最大值),若有多个,按照字典序输出最小的哪一个. 解题思路: 方法一:由于题目说结 ...
- UVA140 ——bandwidth(搜索)
Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an ordering on the ...
- 7_4 素数环(UVa524)<回溯法和生成-测试法的比较>
有一个环(ring)是由n个圈圈所组成的(在这里n一定是个偶数),我们想要把1到n的自然数各放到一个圈圈中,使得相邻2个圈圈中的数的和一定是素数.下图为n=6的情形.请注意:第1个圈圈中的数一定是1. ...
随机推荐
- php利用gd实现图片的边框
<?php //实现两张图片合并 并内图片有一定的边框 $file = 'image/qr_1047.png'; $logo = 'image/logo_1047.jpg'; $code = ' ...
- zepto的使用方法
有些不了解zepto的同学在刚接触的时候肯定有很多疑惑,这个东西怎么用啊,去哪里下载啊,什么时候该用什么时候不该用啊,其实我以前也是这样的.jquery使用多了那么就让我们一起来了解下zepto把. ...
- 让textarea和附近的文字居中对齐
textarea {display:inline-block;vertical-align:middle;}
- 怎么样刷新frameset的整个页面
<a href="main.html?a=2" target="_parent">? 设置a链接的target属性值为_parent即可
- 【从零开始】用node搭建一个jsonp&json服务
目录: 一.介绍 二.node安装 三.webstorm配置node环境 四.代码介绍 五.如何使用 六.自定义域名 七.其他 一.介绍 1.背景 日常工作中,跟后端商定好接口格式后:通常采用 ...
- 【Android Developers Training】 32. 向其它应用发送简单数据
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Navigation Controller 创建方法
添加Navigation Controller的方法主要有两种: 第一种:主要是通过在storyboard中拖入Object library 中的Navigation Controller 第二种方法 ...
- if else的错误用法!
在学习C语言的时候,我们会了解和认识if else 的用法, 并在程序里面使用它来作为判断条件! if(表达式) //先定义一个条件,如果成立,则循环if里面的语句. { 语句 } el ...
- js动态增加秒数(自动,手动)
//获取当前的日期及时间Date var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.get ...
- 【笔记】记一次.net语法await和async的异步编程实验与笔记。
1.实践代码全记录: using System; using System.Collections.Generic; using System.Diagnostics; using System.Li ...