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个数组成一个环,环内的数字不能重复,左右 ...
随机推荐
- codeforces #516---ABC
A---golden plate http://codeforces.com/contest/1072/problem/A 题意:给一个n*m的格子,从最外层往里涂色,每次尽量涂最外面的那一圈,两圈涂 ...
- Strongly connected---hdu4635(强联通分量)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 先判断图是否强连通.如果不是强连通的,那么缩点. 我们的目的是加最多的边,那么最后的图中,肯定两 ...
- python之轮询、长轮询、websocket
轮询 ajax轮询 ,ajax轮询 的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息. 1.后端代码 from flask import Flask,render_templat ...
- java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps;
用Maven创建了一个spark sql项目,在引入spark sql jar包时引入的是: <dependency> <groupId>org.apache.spark< ...
- python学习之路-day10
一.什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程. 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程. 车间负责把资源 ...
- la3523 白书例题 圆桌骑士 双联通分量+二分图
具体题解看大白书P316 #include <iostream> #include <algorithm> #include <vector> #include & ...
- jQuery中的prop和attr区别
最近在做一个项目用jq时发现一个问题 在谷歌中可以正常出效果 但是在火狐中就是不行 就是这个prop和attr 之前用的是attr方法 但是在火狐中不出效果 于是特意看了两者的区别 主要 ...
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xbb in position 51: ord
1.问题描述:一个在Django框架下使用Python编写的定时更新项目,在Windows系统下测试无误,在Linux系统下测试,报如下错误: ascii codec can't decode byt ...
- Vue学习笔记之Nodejs入门
0x00 前言 打开Nodejs英文网:https://nodejs.org/en/ 中文网:http://nodejs.cn/ 我们会发现这样一句话: 翻译成中文如下: Node.js 是一个基于 ...
- Django加载静态网页模板
Django加载静态网页模板 步骤: 第一步:在子系统blog根目录下新建模版目录templates,里面新建一个login.html <!DOCTYPE html> <html l ...