UVA-140 Bandwidth (回溯+剪枝)
题目大意:求一个使带宽最小的排列和最小带宽。带宽是指一个字母到其相邻字母的距离最大值。
题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个。一、当前解不如最优解优时,减去;二、预测的理想解不必最优解优时,减去。将与当前最后一个位置上的字母相邻的字母全部接过来,便得理想解。
代码如下:
# include<iostream>
# include<cstdio>
# include<string>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std;
char p[100];
vector<int>v[30],w;
int ans,vis[30],n;
string ansp;
void init()
{
int l=strlen(p);
int now;
for(int i=1;i<l;++i){
if(p[i]==';')
continue;
if(p[i]==':'){
now=p[i-1]-'A';
continue;
}
if(p[i-1]!=';'){
vector<int>::iterator it;
it=find(v[now].begin(),v[now].end(),p[i]-'A');
if(it==v[now].end())
v[now].push_back(p[i]-'A');
it=find(v[p[i]-'A'].begin(),v[p[i]-'A'].end(),now);
if(it==v[p[i]-'A'].end())
v[p[i]-'A'].push_back(now);
}
}
for(int i=0;i<30;++i)
sort(v[i].begin(),v[i].end());
w.clear();
vector<int>::iterator it;
for(int i=0;i<l;++i){
if(p[i]==':'||p[i]==';')
continue;
it=find(w.begin(),w.end(),p[i]-'A');
if(it==w.end())
w.push_back(p[i]-'A');
}
sort(w.begin(),w.end());
n=w.size();
}
int f(string app,int g,int pos)
{
for(int i=0;i<app.size();++i){
if(i==pos)
continue;
if(app[i]==g+'A')
return i;
}
return pos;
}
int get(string app)
{
int res=0;
int l=app.size();
for(int i=0;i<l;++i){
for(int j=0;j<v[app[i]-'A'].size();++j){
int pos=f(app,v[app[i]-'A'][j],i);
res=max(res,abs(pos-i));
}
}
return res;
}
void dfs(int cur,int now,string ap)
{
if(cur==n){
if(now<ans){
ans=now;
ansp=ap;
}
return ;
}
if(now>=ans)
return ;
int l=ap.size();
if(l>0){
string app=ap;
for(int i=0;i<v[ap[l-1]-'A'].size();++i){
int j;
for(j=0;j<l;++j)
if(v[ap[l-1]-'A'][i]==ap[j]-'A')
break;
if(j>=l)
app+=char(v[ap[l-1]-'A'][i]+'A');
}
if(get(app)>=ans)
return ;
}
for(int i=0;i<n;++i){
if(vis[w[i]])
continue;
vis[w[i]]=1;
dfs(cur+1,get(ap+char(w[i]+'A')),ap+char(w[i]+'A'));
vis[w[i]]=0;
}
}
int main()
{
while(scanf("%s",p))
{
if(p[0]=='#')
break;
for(int i=0;i<30;++i)
v[i].clear();
init();
ans=100;
ansp.clear();
memset(vis,0,sizeof(vis));
dfs(0,0,"");
int len=ansp.size();
for(int i=0;i<len;++i)
printf("%c ",ansp[i]);
printf("-> %d\n",ans);
}
return 0;
}
UVA-140 Bandwidth (回溯+剪枝)的更多相关文章
- UVA 140 Bandwidth (dfs 剪枝 映射)
题意: 给定一个n个结点的图G和一个结点的排列, 定义结点i的带宽b(i)为i和相邻结点在排列中的最远距离, 所有b(i)的最大值就是这个图的带宽, 给定G, 求让带宽最小的结点排列. 给定的图 n ...
- uva 140 bandwidth (好题) ——yhx
Bandwidth Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an orde ...
- UVa 208 - Firetruck 回溯+剪枝 数据
题意:构造出一张图,给出一个点,字典序输出所有从1到该点的路径. 裸搜会超时的题目,其实题目的数据特地设计得让图稠密但起点和终点却不相连,所以直接搜索过去会超时. 只要判断下起点和终点能不能相连就行了 ...
- UVa 140 Bandwidth【枚举排列】
题意:给出n个节点的图,和一个节点的排列,定义节点i的带宽b[i]为i和其相邻节点在排列中的最远的距离,所有的b[i]的最大值为这个图的带宽,给一个图,求出带宽最小的节点排列 看的紫书,紫书上说得很详 ...
- UVA 140 Bandwidth
题意: 给出一个n个节点的图G,和一个节点的排列,定义节点i的带宽为i和相邻节点在排列中的最远距离,而所有带宽的最大值就是图的带宽,求让图的带宽最小的排列. 分析: 列出所有可能的排列,记录当前找到的 ...
- UVA - 140 Bandwidth(带宽)(全排列)
题意:给定图,求是带宽最小的结点排列. 分析:结点数最多为8,全排列即可.顶点范围是A~Z. #pragma comment(linker, "/STACK:102400000, 10240 ...
- HDU 5113 Black And White 回溯+剪枝
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5113 Black And White Time Limit: 2000/2000 MS (Java/ ...
- HDU 2553 N皇后问题(回溯 + 剪枝)
本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398797 题意: 在N*N(N <= 10)的方格棋盘放置了N个皇后,使得它们不相互攻击(即 ...
- HDU1010 Tempter of the Bone(回溯 + 剪枝)
本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398734 题意: 输入一个 N * M的迷宫,这个迷宫里'S'代表小狗的位置,'X'代表陷阱,‘D ...
- HDU1016 Prime Ring Problem (回溯 + 剪枝)
本文链接:http://www.cnblogs.com/Ash-ly/p/5398684.html 题意: 给你一个数字N(N <= 20),要求你把这N个数组成一个环,环内的数字不能重复,左右 ...
随机推荐
- poj3345 Bribing FIPA【树形DP】【背包】
Bribing FIPA Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5910 Accepted: 1850 Desc ...
- Oracle 11gR2 RAC监听器原理介绍
一.基本概念 oracle11gR2 RAC开始引入scan概念,一般通过dns服务器或gns服务器解析scan,也可以使用/etc/hosts文件解析scan,只不过oracle官方不建议这样做,h ...
- CMDB内功心法,助我登上运维之巅
很多70.80后甚至90后都在金庸.古龙.梁羽生先生等武林大家熏陶下成长的,这么多年过去了,我的武侠梦依然不曾散去.曾几何,梦想有一天练就一身绝学,搂着小师妹花前月下,仗剑走天涯,快意人生.可每次的酣 ...
- 关于uuid与自增列的选择
关于uuid与自增列的选择 在db交流群里看到有人提问,说他的userName 登录名是唯一的,可以用其做主键嘛,如果用自增列,那又要多一列. 后面又说,如果要用主键ID,用uuid会不会好一些呢?作 ...
- mysql 数据操作 单表查询 使用正则表达式查询
SELECT * FROM employee WHERE name REGEXP '^ale'; SELECT * FROM employee WHERE name REGEXP 'on$'; SEL ...
- python3 捕捉代码行出错的小程序
下面主要使用的是: try .. except .. else .. finally ...,用的是 traceback 这个第三方模块. import traceback #捕捉哪行代码报错 def ...
- java基础知识 构造方法
在java里面,构造方法也就是构造函数 构造函数=构造方法;构造方法是一种特殊的方法,具有以下特点.(1)构造方法的方法名必须与类名相同.(2)构造方法没有返回类型,也不能定义为void,在方法名前面 ...
- uva11324 有向图的强连通分量+记忆化dp
给一张有向图G, 求一个结点数最大的结点集,使得该结点集中任意两个结点u和v满足,要么u可以到达v, 要么v可以到达u(u和v相互可达也可以). 因为整张图可能存在环路,所以不好使用dp直接做,先采用 ...
- centos6.5搭建svn
检查已经安装版本 rpm -qa subversion如果存在旧版本,卸载yum remove subversion 安装svn yum install subversion 验证是否安装成功 sv ...
- Vue学习笔记之vue-cli脚手架项目中组件的使用
在webpack-simple模板中,包括webpck模板.一个.vue文件就是一个组件. 为什么会这样呢?因为webpack干活了!webpack的将我们所有的资源文件进行打包.同时webpack还 ...