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个数组成一个环,环内的数字不能重复,左右 ...
随机推荐
- zabbix debug and vulnerability https://www.zabbix.com/documentation/3.0/manual/concepts/sender
https://www.zabbix.com/documentation/3.0/manual/concepts/sender zabbix--- zabbix_sender -vv -z 172.2 ...
- Python开发【项目】:生产环境下实时统计网站访问日志信息
日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...
- conda 管理 python 版本
conda常用命令 查看当前系统下的环境 conda info -e 创建新的环境 # 指定python版本为2.7 conda create -n env_name python=2.7 # 同时安 ...
- Windows 10 升级软件 Windows 10 易升
进入 https://www.microsoft.com/zh-cn/software-download/windows10 点立即更新,弹出如下下载地址. https://download.micr ...
- 1.Anaconda安装Tensorflow报错UnicodeDecodeError: 'utf-8' codec can't decode ## invalid start byte的问题之解决
安装TensorFlow pip install --ignore-installed --upgrade tensorflow 报错: UnicodeDecodeError: 'utf-8' cod ...
- android 的 ExpandableListView Example Tutorial
https://www.journaldev.com/9942/android-expandablelistview-example-tutorial Welcome to Android Expan ...
- Python 之各种推导式玩法
推导式套路 之前我们已经学习了最简单的列表推导式和生成器表达式.但是除此之外,其实还有字典推导式.集合推导式等等. 下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式. variable ...
- 使用spring boot ,和前端thymeleaf模板进行开发路径问题
加入引用:<html xmlns:th="http://www.thymeleaf.org">1:引用templates模板下面的文件时,不要用/绝对路径. 2:引用s ...
- Z-score标准化[转载]
转自:https://blog.csdn.net/Orange_Spotty_Cat/article/details/80312154 1.意义 Z-Score通过(x-μ)/σ将两组或多组数据转化为 ...
- log4j2介绍及配置
一.log4j2概述 在日常的开发,测试和生产环境中,日志记录了应用,服务运行过程中的关键信息,以及出现异常时的堆栈,这些信息常常作为查询,定位,解决问题的关键,因此在任何系统中,对日志的使用得当,将 ...