题目链接:https://vjudge.net/contest/210334#problem/F

 转载于:https://www.cnblogs.com/luruiyuan/p/5847706.html

题目大意:
给出一个n个节点的图,求该图中相邻的节点在哪一个由这些节点组成的排列中,带宽最小,输出该排列和最小带宽。(各个节点到相邻节点的最远距离,这些最远距离的最大值即为带宽。)

紫书上介绍了两种剪枝方法,但是以下只给出了一种比较好实现的剪枝。

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;const int maxn = 10, inf = 0x7fffffff;
char letter[maxn], s[100];//字母,输入序列
int id[256]; //字母的编号
int p[maxn]; //全排列的遍历数组 ,存储的是每个字母的编号
int pos[maxn];//记录每个字母的位置,避免频繁使用strchr int main() {while (scanf("%s", &s), s[0] != '#') {int len = strlen(s), n = 0;for (char ch = 'A'; ch <= 'Z'; ch++)if (strchr(s, ch) != NULL) {letter[n] = ch;id[ch] = n++;}vector<int> u, v;for (int i = 0; i<len; i++) {int t = i;//记录起始节点 i += 2;while (i<len && s[i] != ';') {u.push_back(id[s[t]]);//加入起始节点 v.push_back(id[s[i]]);//加入起始节点的相邻节点 i++;}}//遍历+剪枝                     //以下只用了一种剪枝方式,即若发现当前已经排列有某两节点带宽超过了已经遍历过的排列的最小带宽,则当前排列直接跳过int bandwidth = 0, res = inf;int bestP[maxn];//存储最终结果 for (int i = 0; i<n; i++)p[i] = i;do {bandwidth = 0;//初始化别忘了 for (int i = 0; i<n; i++)pos[p[i]] = i;//记录编号为pi的节点的位置 for (int i = 0; i<u.size(); i++) {bandwidth = max(bandwidth, abs(pos[u[i]] - pos[v[i]]));if (bandwidth >= res)break;//剪枝
            }if (bandwidth<res) {memcpy(bestP, p, sizeof(p));//memcpy比较快 res = bandwidth;}} while (next_permutation(p, p + n));          //进行下一个排列的比较for (int i = 0; i<n; i++)printf("%c ", letter[bestP[i]]);printf("-> %d\n", res);}
}

2018-04-15

转载于:https://www.cnblogs.com/00isok/p/8848175.html

UVa140 Bandwidth 【最优性剪枝】相关推荐

  1. HDU - 1584 蜘蛛牌(dfs+最优性剪枝)

    题目链接:点击查看 题目大意:给出10张牌,随机分布在1~10十个不同的位置,要求模拟蜘蛛纸牌的游戏规则,问移动的最短距离之和是多少 题目分析:我们可以直接dfs搜索,但需要想清楚该怎么搜索,这个题目 ...

  2. POJ - 3700 Missile Defence System.(dfs+最优性剪枝)

    题目链接:点击查看 题目大意:给出n个导弹的飞行高度,规定一个导弹拦截装置只能拦截严格升序的导弹或严格降序的导弹,问拦截所有导弹需要最少多少个拦截装置 题目分析:之前做过一个dp题,那个题目简单,是只 ...

  3. noip2012 文化之旅 (深搜,最优性剪枝)

    P2070 [NOIP2012P4]文化之旅 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP 2012 普及组 题4 描述 有一位使者要游历各国,他 ...

  4. Uva140 Bandwidth 全排列+生成测试法+剪枝

    参考过仰望高端玩家的小清新的代码... 思路:1.按字典序对输入的字符串抽取字符,id[字母]=编号,id[编号]=字母,形成双射       2.邻接表用两个vector存储,存储相邻关系     ...

  5. uva140 Bandwidth

    https://vjudge.net/problem/UVA-140 给出一个图,构造一个排列,使图上相邻节点在排列中的距离最大值最小 没有剪枝,竟然10ms过了,~~~ #include<cs ...

  6. UVA140 Bandwidth带宽

    给出一个图节点数为n(n8)让这些节点排序,使得节点的最大带宽要最小,最大带宽就是排列里面与节点相离最远的距离. 有两种方法,第一,因为n比较小就可以枚举全部,然后一个一个的比较,还有一种就是边排列边 ...

  7. python【数据结构与算法】剪枝策略

    文章目录 1 剪枝概述 2 例题 1 剪枝概述 剪枝是搜索常用的优化手段,常常能把指数级的复杂度,优化到近似多项式的复杂度.   剪枝是一个比喻:把不会产生答案的,或不必要的枝条"剪掉&qu ...

  8. 斗地主(深搜+贪心+剪枝)

    斗地主 题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=4325 solution 由于牌数不是很多,n<=23,一开始想到用状态压缩的方 ...

  9. POJ - 1190 生日蛋糕(dfs+剪枝)

    题目链接:点击查看 题目大意:给出生日蛋糕的总体积,以及有多少层,我们要求下面的每一层的高度和半径都要比上面一层的大,并且都是整数,求满足要求的最小表面积 题目分析:因为题目提到了半径和高度都是整数, ...

最新文章

  1. HDU 2034 人见人爱A-B
  2. Python中使用元组对ndarray矩阵的某个维度进行选取和调序的操作
  3. 10 个常见的 Linux 终端仿真器
  4. Maven:mirror和repository 区别
  5. 使用gluoncv.model_zoo进行目标检测
  6. 课堂练习---最低价格买书
  7. Python爬虫_乱码、转码
  8. Oracle DataGuard数据备份方案详解
  9. C++输入与输出—cout和cin的用法
  10. jquery.autocomplete自动补齐和自定义格式
  11. 文本框换行_word的段落标记与换行,你真的知道么?
  12. 银联网关支付 java版
  13. 如何用php建立图库,教你搭建自己的图片库
  14. 微信测试公众号申请配置
  15. 13_ue4进阶_蒙太奇动画实现一边走一边攻击
  16. Actor模型与Akka
  17. jdbc连接mysql的serverTimeZone参数配置
  18. Ubuntu18.04编译Openwrt 15.05.1 Chaos Calmer版本固件遇到的问题汇总
  19. 中国大陆总体健康指数高于全球和亚太水平;洲际集团旗下九寨英迪格酒店将于9月开业 | 美通社头条...
  20. 大学本科毕业论文查重有什么要求?

热门文章

  1. 汲取Linux灵感 Pivotal开源大数据套件
  2. 阿里云的RDS 查看binlog日志的方法
  3. Apache shiro
  4. 用EL表达式显示客户端使用的浏览器
  5. Visio 与 Access 2007 的集成应用
  6. 利用 cwRsync 实现代码(文件)同步的解决办法
  7. google 插件_google这4款插件我每天都用,省时无数
  8. 疲劳驾驶样本集_欧洲要求,2022年开始新车必须配备DMS(防疲劳预警)系统
  9. Java NIO学习篇之缓冲区Buffer详解
  10. mybatis mysql uuid_spring boot整合mybatis利用Mysql实现主键UUID的方法