题目大意:求一个使带宽最小的排列和最小带宽。带宽是指一个字母到其相邻字母的距离最大值。

题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个。一、当前解不如最优解优时,减去;二、预测的理想解不必最优解优时,减去。将与当前最后一个位置上的字母相邻的字母全部接过来,便得理想解。

代码如下:

# 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 (回溯+剪枝)的更多相关文章

  1. UVA 140 Bandwidth (dfs 剪枝 映射)

    题意: 给定一个n个结点的图G和一个结点的排列, 定义结点i的带宽b(i)为i和相邻结点在排列中的最远距离, 所有b(i)的最大值就是这个图的带宽, 给定G, 求让带宽最小的结点排列. 给定的图 n ...

  2. 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 ...

  3. UVa 208 - Firetruck 回溯+剪枝 数据

    题意:构造出一张图,给出一个点,字典序输出所有从1到该点的路径. 裸搜会超时的题目,其实题目的数据特地设计得让图稠密但起点和终点却不相连,所以直接搜索过去会超时. 只要判断下起点和终点能不能相连就行了 ...

  4. UVa 140 Bandwidth【枚举排列】

    题意:给出n个节点的图,和一个节点的排列,定义节点i的带宽b[i]为i和其相邻节点在排列中的最远的距离,所有的b[i]的最大值为这个图的带宽,给一个图,求出带宽最小的节点排列 看的紫书,紫书上说得很详 ...

  5. UVA 140 Bandwidth

    题意: 给出一个n个节点的图G,和一个节点的排列,定义节点i的带宽为i和相邻节点在排列中的最远距离,而所有带宽的最大值就是图的带宽,求让图的带宽最小的排列. 分析: 列出所有可能的排列,记录当前找到的 ...

  6. UVA - 140 Bandwidth(带宽)(全排列)

    题意:给定图,求是带宽最小的结点排列. 分析:结点数最多为8,全排列即可.顶点范围是A~Z. #pragma comment(linker, "/STACK:102400000, 10240 ...

  7. HDU 5113 Black And White 回溯+剪枝

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5113 Black And White Time Limit: 2000/2000 MS (Java/ ...

  8. HDU 2553 N皇后问题(回溯 + 剪枝)

    本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398797 题意: 在N*N(N <= 10)的方格棋盘放置了N个皇后,使得它们不相互攻击(即 ...

  9. HDU1010 Tempter of the Bone(回溯 + 剪枝)

    本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398734 题意: 输入一个 N * M的迷宫,这个迷宫里'S'代表小狗的位置,'X'代表陷阱,‘D ...

  10. HDU1016 Prime Ring Problem (回溯 + 剪枝)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5398684.html 题意: 给你一个数字N(N <= 20),要求你把这N个数组成一个环,环内的数字不能重复,左右 ...

随机推荐

  1. poj3171 Cleaning Shifts【线段树(单点修改区间查询)】【DP】

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4422   Accepted: 1482 D ...

  2. Android中的Apk的加固(加壳)原理解析和实现(转)

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

  3. scrapy之定制命令

    单爬虫运行 import sys from scrapy.cmdline import execute if __name__ == '__main__': execute(["scrapy ...

  4. ArcEngine几何变换中的策略模式

    使用策略模式可以减少分支语句,switch...Case,同时便于策略的扩展. 1. ITransform2D接口的Transform方法: [C#]public void Transform ( e ...

  5. 使用JavaScript修改浏览器URL地址栏的实现代码

    现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起来,当你在浏览器点击后退按钮的时候,你可以冲浏览历史上获得回退的信息,这听起来并不 ...

  6. (2)R中的数据类型和数据结构

    R中的数据结构主要面向<线性代数>中的一些概念,如向量.矩阵等.值得注意的是,R中其实没有简单数据(数值型.逻辑型.字符型等),对于简单类型会自动看做长度为1的向量.比如: > b= ...

  7. Linux系统——ssh-key连接原理

    SSH是一种客户端连接,在Linux服务器下通过远程的方式将本地电脑连接到对方的电脑上. 远程连接的方式: (1)telnet命令(为明文传输,不安全) (2)(2)SSH(加密传输,安全) 操作的两 ...

  8. (转)SSIS_数据流转换(Union All&合并联接&合并)

    Union All : 与sql语言 Union All 一样,不用排序,上下合并多个表.Union All转换替代合并转换:输入输出无需排序,合并超过两个表 合并联接 : 有左连接.内连接.完全连接 ...

  9. Spring—spring概述

    Spring框架的特点? 1:轻量级,一站式开发 2:易用,追求代码的最佳实现 3:Spring的内容: a:Ioc容器 b:AOP实现 c:数据访问支持(ORM框架/声明事务[Transaction ...

  10. CCPC-Wannafly Winter Camp Day3 (Div2, onsite)

    Replay Dup4: 没想清楚就动手写? 写了两百行发现没用?想的还是不够仔细啊. 要有莽一莽的精神 X: 感觉今天没啥输出啊, 就推了个公式?抄了个板子, 然后就一直自闭A. 语文差,题目没理解 ...