UVA140 剪枝
分析:这个题的数据范围很小,直接打印全排列去判断也能过,但是这里存在两个剪枝,第一个,如果当前的距离已经大于前面距离的最小值,则剪枝,还有一个就是如果与当前结点相连的边数大于等于前面距离的最小值,则剪枝
#include "iostream"
#include "cstdio"
#include "cstring"
#include "string"
#include "map"
#include "set"
#include "vector"
#include "algorithm"
#include "cmath"
using namespace std;
const int INF=;
const int maxn=;
char a[maxn];
char t[maxn];
string s;
int minx;
map<char,string>mp;
void dfs(int cur,char B[],char vis[],vector<char> &c,int n){
if(cur==n){
int maxn=;
int flag=;
for(int i=;i<n;i++){
for(int j=;j<(int)mp[B[i]].length();j++){
int pos;
for(int k=;k<n;k++){
char ch=mp[B[i]][j];
if(B[k]==mp[B[i]][j]){
pos=k; break;
}
}
maxn=max(maxn,abs(pos-i));
if(maxn>minx){
flag=; break;
}
}
if(flag) break;
}
if(maxn<minx&&!flag){
minx=maxn;
c.clear();
for(int i=;i<n;i++)
c.push_back(B[i]);
}
}else{
for(int i=;i<n;i++){
int ok=;
for(int j=;j<cur;j++)
if(vis[i]==B[j]){
ok=; break;
}
if(!ok){
B[cur]=vis[i];
dfs(cur+,B,vis,c,n);
}
}
}
} int main()
{
while(cin>>s)
{
if(s[]=='#') break;
int len=s.length();
int i=;
set<char> str;
while(i<len){
char ch;
while(i<len&&s[i]!=':'){
ch=s[i];
str.insert(ch);
i++;
}
i++;
while(i<len&&s[i]!=';'){
mp[ch]+=s[i];
str.insert(s[i]);
i++;
}
i++;
}
set<char>::iterator set_iter=str.begin();
int k=;
for(;set_iter!=str.end();set_iter++){
a[k++]=*set_iter;
}
minx=INF;
vector<char> Q;
dfs(,t,a,Q,k);
for(int i=;i<Q.size();i++){
printf("%c ",Q[i]);
}
printf("-> %d\n",minx);
for(int i=;i<k;i++)
mp[a[i]]="";
}
}
UVA140 剪枝的更多相关文章
- UVa140 Bandwidth 小剪枝+双射小技巧+枚举全排列+字符串的小处理
给出一个图,找出其中的最小带宽的排列.具体要求见传送门:UVa140 这题有些小技巧可以简化代码的编写. 本题的实现参考了刘汝佳老师的源码,的确给了我许多启发,感谢刘老师. 思路: 建立双射关系:从字 ...
- Uva140 Bandwidth 全排列+生成测试法+剪枝
参考过仰望高端玩家的小清新的代码... 思路:1.按字典序对输入的字符串抽取字符,id[字母]=编号,id[编号]=字母,形成双射 2.邻接表用两个vector存储,存储相邻关系 ...
- UVa140 Bandwidth 【最优性剪枝】
题目链接:https://vjudge.net/contest/210334#problem/F 转载于:https://www.cnblogs.com/luruiyuan/p/5847706.ht ...
- UVA-140 Bandwidth (回溯+剪枝)
题目大意:求一个使带宽最小的排列和最小带宽.带宽是指一个字母到其相邻字母的距离最大值. 题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个.一.当前解不如最优解优时,减去:二.预测的理想解不必最 ...
- 7_6 带宽(UVa140)<回溯法:最优性剪枝>
给定一个图(V,E),其中V为顶点的集合,E为边的集合,属于VxV.给定V中元素的一种排序,那么顶点v的带宽定义如下:在当前给定的排序中,与v距离最远的且与v有边相连的顶点与v的距离.给定排序的带宽定 ...
- uva140 - Bandwidth
Bandwidth Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an orderi ...
- α-β剪枝算法的java语言实现(非常实用)
利用α-β剪枝算法,对下图所示的博弈树进行搜索,搜索得到根节点选择的走步,以及没有必要进行评估的节点,并求出给出在何处发生了剪枝,以及剪枝的类型(属于α剪枝还是β剪枝). 注:□表示MIN节点:○表示 ...
- Sicily 1153: 马的周游问题(DFS+剪枝)
这道题没有找到一条回路,所以不能跟1152一样用数组储存后输出.我采用的方法是DFS加剪枝,直接DFS搜索会超时,优化的方法是在搜索是优先走出度小的路径,比如move1和move2都可以走,但是如走了 ...
- HDU5887 Herbs Gathering(2016青岛网络赛 搜索 剪枝)
背包问题,由于数据大不容易dp,改为剪枝,先按性价比排序,若剩下的背包空间都以最高性价比选时不会比已找到的最优解更好时则剪枝,即 if(val + (LD)pk[d].val / (LD)pk[d]. ...
随机推荐
- DTD概述
1. 什么是XML文件 可扩展标记语言,标准通用标记语言的子集,是用于标记电子文件使其具有结构性的标记语言. 2. 什么是dtd文件 DTD(文档类型定义)的作用是定义XML文档的合法构建模块.它使用 ...
- 连接mysql报错 : The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone...
time zone 时区错误 DBEAVER连接MySQL运行报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or repres ...
- windows 下QT5.5+vs2013开发环境搭建
开发环境搭建: 1.下载QT,下载的网址如下: http://download.qt.io/official_releases/vsaddin/ http://download.qt.io/offic ...
- ipython结合virtualenv使用
1.virtualenv使python的开发环境相互隔离,隔离环境可以安装自己的依赖包,避免冲突 2.ipython是交互使用python变的便利 3.在virtualenv环境里使用ipython即 ...
- android开发之 Wifi的四个类
android开发之 Wifi的四个类 在Android中对Wifi操作,android本身提供了一些实用的包,在android.net.wifi包以下.简介一下: 大致能够分为四个基本的类ScanR ...
- 【转】 C++ 简单的 Tcp 实现[socket] 客户端与客户端通信
// 服务器端代码 // Server.cpp : Defines the entry point for the console application.// #include "std ...
- BUPT复试专题—科学计算器(2009)
题目描述 给你一个不带括号的表达式,这个表达式只包含加.减.乘.除,请求出这个表 达式的最后结果,最后结果一定是整数: 输入 一个数学表达式,只包括数字,数字保证是非负整数,以及五种运算符 " ...
- ftp服务器调用出错
因工作需要,需从FTP服务器上下载文件,本地测试OK,服务器上在FTP服务器连接之后卡住,没有异常和提示信息,在打印FTP命令之后,显示:150 Opening data channel for fi ...
- 一种排序(nyoj8)(简单排序)
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 如今有非常多长方形.每个长方形都有一个编号,这个编号能够反复.还知道这个长方形的宽和长,编号.长.宽都是整数 ...
- Android源代码解析之(三)-->异步任务AsyncTask
转载请标明出处:一片枫叶的专栏 上一篇文章中我们解说了android中的异步消息机制. 主要解说了Handler对象的使用方式.消息的发送流程等.android的异步消息机制是android中多任务处 ...