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个数组成一个环,环内的数字不能重复,左右 ...
随机推荐
- CSU 1808 地铁 (Dijkstra)
Description Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站,用 1,2,-,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i 段地铁属于 ci ...
- poj1961 & hdu1358 Period【KMP】
Period Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 20436 Accepted: 9961 Descripti ...
- Tensorflow 实战Google深度学习框架 第五章 5.2.1Minister数字识别 源代码
import os import tab import tensorflow as tf print "tensorflow 5.2 " from tensorflow.examp ...
- 怎么将Android的API demo导入到Eclipse工作区中
File ->New Android Project 选择Create project from existing sample (不同Android版本有对应的ApiDemo示例).
- Django - 路由层(URLconf)
一.django 静态文件配置 /mysite1/settings.py STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_ ...
- yum whatprovides 查找哪个包可以提供缺失的文件
yum whatprovides 查找哪个包可以提供缺失的文件
- Oracle数据库的经典问题 snapshot too old是什么原因引起的
Oracle数据库的经典问题 snapshot too old是什么原因引起的 ORACLE经典错误求解:ORA-1555错误(Snapshot too old ) - ... 书上说是因为the r ...
- 跟我学Makefile(四)
使用函数:函数调用,很像变量的使用,也是以“$”来标识的,其语法如下: $(<function> <arguments>) 或是 ${<function> < ...
- Selenium IDE脚本录制步骤简介
录制脚本步骤: 1.打开Selenium IDE,输入需要录制脚本的地址,然后启动Firefox,输入selenium IDE需录制的地址,根据实际需求,做相关操作: 2.录制过程中,会发现做的相关操 ...
- JavaScript的基础语法
对于Javascript的而言没有数据类型的全部都是通过var来定义创建的.比如: <!DOCTYPE html> <html> <head> <meta c ...