题目:https://vjudge.net/problem/UVA-140

解题思路:


1.全排列:使用库函数next_permutation(a,a+n)

2.最优性剪枝:如果目前已经找到的最小带宽是k,若在新的一组排列中,发现已经有两个结点的距离大于或等于k,应强制把它“剪”掉,即剪枝。

3.全排列时肯定要对输入中出现的字母所对应的int数组做全排列,所以要对出现的字母做标记!

(1)首先A~Z每个字母在读入的字符数组s[]中遍历,查找是否出现过,num初始为0

若出现,letter[num]=ch;   id[ch]=num++;

则可对s[]中出现的所有字母(不重复)按照字典序从小到大编号,即id

(2)vector<int> u,v;

遍历s[],将  :前面的字母对应的id加入u中, :后面的字母对应的id加入v中,且这两个操作同时进行

(3)p[]输出初始化为p[i]=i; //p[]记录每次全排列后对应的id序列

每次pos[p[i]]=i;  //pos[]记录id(id=p[i])在全排列后的序列中的位置

(举例:p[]第一全排列即初始化后为:{0,1,2,3,4,5,6}

pos[p[5]]=pos[5]=5; pos[p[6]]=pos[6]=6; //id=5在位置5,di=6在位置6

p[]第二次全排列后为:{0,1,2,3,4,6,5}

pos[p[5]]=pos[6]=5;  pos[p[6]]=pos[5]=6;//id=6在位置5,id=5在位置6

因为id对应着字母,所以可以知道两个字母之间的带宽,即abs(pos[u[i]]-pos[v[i]])

不断更新最优的带宽对应的全排列id序列,用memcpy(ansp,p,sizeof(p))比数组一个一个赋值要快

执行next_permutation(p,p+num);

 把样例带进入执行一遍就懂了!

ac代码:


#include <iostream>
#include <cmath>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
#define maxn 10
#define inf 0x3fffffff
using namespace std;
typedef long long ll;
int id[100];//字母对应的编号,(int)'Z'=90
char s[500],letter[30];
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);while(scanf("%s",s)){if(s[0]=='#') break;int p[maxn],pos[maxn],ansp[maxn];int num=0,len=(int)strlen(s);for(char ch='A';ch<='Z';ch++)if(strchr(s,ch)){letter[num]=ch;//若知道字母的id编号,则可由letter数组获取该字母,以便输出id[ch]=num++;}vector<int> u,v;//u[i]与v[i]之间有边,u[i]和v[i]都是记录id编号for(int i=0;i<len;i++){int t=i;i+=2;//i指向:后面的第一位while(i<len && s[i]!=';'){u.push_back(id[s[t]]);v.push_back(id[s[i]]);i++;}}int width=0,ans=inf;for(int i=0;i<num;i++) p[i]=i;do{width=0;for(int i=0;i<num;i++) pos[p[i]]=i;for(int i=0;i<u.size();i++){width=max(width,abs(pos[u[i]]-pos[v[i]]));if(width>=ans) break;//剪枝}if(width<ans){ans=width;memcpy(ansp,p,sizeof(p));}}while(next_permutation(p,p+num));for(int i=0;i<num;i++)printf("%c ",letter[ansp[i]]);printf("-> %d\n",ans);}return 0;
}

【UVA140】Bandwidth(最优性剪枝+全排列+思路)相关推荐

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

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

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

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

  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/contest/210334#problem/F  转载于:https://www.cnblogs.com/luruiyuan/p/5847706.ht ...

  6. uva140 Bandwidth

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

  7. UVA140 Bandwidth带宽

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

  8. c语言如何实现1-n全排列,全排列思路解析附C语言实现

    全排列这个问题,几乎是面试必问的问题,考察面试者递归,逻辑分析问题的能力 笔者在10年看谭浩强的c语言的时候,就接触过这个算法,只可惜那时候老师并没有严格让我们去实现 自己学习的时候也偏注重语法的理解 ...

  9. 深搜、广搜、搜索剪枝

    搜索与回溯讲解 文章目录 深搜 方向向量: DFS代码: 题目讲解: 八皇后问题 字符序列 自然数的拆分 广搜 BFS代码: 题目讲解: 瓷砖 关系网络 bfs与dfs的用途与区别 搜索剪枝 可行性剪 ...

  10. DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释,剪枝技巧)

    目录 那年深夏 引入 1.什么是深度优先搜索(DFS)? 2.什么是栈? 3.什么是递归? 图解过程 问题示例 1.全排列问题 2.迷宫问题 3.棋盘问题(N皇后) 4.加法分解 模板 剪枝 1.简介 ...

最新文章

  1. 关于Gitlab若干权限问题
  2. 增加数据_太原二手房七月数据出炉,挂牌量增加800余套,万柏林区涨幅大
  3. SQLServer2014 安装错误:等待数据库引擎恢复句柄失败
  4. java abs前缀变量_JAVA工具例大全--cn.hutool.setting.AbsSetting读取配置文件例子
  5. 手写一个promise用法_手写一个Promise
  6. ArcSDE数据库连接(直连、服务连)与GT_Geometry存储配置图解
  7. nexttick使用场景_Vue -- nextTick
  8. 【Unity3D】UGUI之Dropdown
  9. selenium 在pycharm中安装selenium
  10. [嵌入式学习必备网站分享]嵌入式开发必须收藏的二十个网站 内附超链接 实用 嵌入式单片机学习网站
  11. 计算机网络WiFi共享,wifi共享软件哪个好 wifi共享软件排行榜推荐
  12. iP138版 离线iP数据库ip.txt导入Mysql示例
  13. 走出软件作坊 第三十章 蛋白质女孩
  14. 沟通的艺术(笔记)——前言
  15. 十一,常量(constant)详细讲解
  16. Java基础篇——面向对象编程
  17. Artificial Intelligence Computer Vision ML and DL
  18. java类名遵从法_程序员必知的Java基础:5条命名规范和8种数据类型归纳
  19. FreeSWITCH开启录音功能
  20. 【实用技巧】CCS.V8创建TMS320F2812工程

热门文章

  1. 蓝桥杯 第几个幸运数 set
  2. android布局性能,Android开发——布局性能优化的一些技巧(一)
  3. php 不通过表单post,php – 简单表单不通过_POST发送数据
  4. java 方法描述符_整理Java编程中常用的基本描述符与运算符
  5. android缓存垃圾扫描功能吗,Android 系统缓存扫描与清理方法分析
  6. java中model的意思_开发中model,entity和pojo的区别
  7. html语言标记说明,HTML中注释标签的使用方法
  8. java 各种数据结构,几种常见的数据结构的JAVA实现
  9. 如何避免_如何避免钢板弹簧受损
  10. 打开SQlite数据库