UVa 140 Bandwidth【枚举排列】
题意:给出n个节点的图,和一个节点的排列,定义节点i的带宽b[i]为i和其相邻节点在排列中的最远的距离,所有的b[i]的最大值为这个图的带宽,给一个图,求出带宽最小的节点排列
看的紫书,紫书上说得很详细--
看标程的时候算每个图的带宽的时候看了好久,原来是这样的
打印出u[i],v[i]的值就知道了
样例:
A:FB;B:GC;D:GC;F:AGH;E:HD
#
对于每一个u[i],v[i],abs(u[i]-v[i])就是相邻节点之间的距离, 再在这里面找出最大值
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std; 12 13 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) 14 15 typedef long long LL; 16 const int INF = (1<<30)-1; 17 const int mod=1000000007; 18 const int maxn=100005; 19 20 char input[maxn]; 21 int id[maxn],letter[maxn]; 22 23 24 int main(){ 25 // freopen("in.txt","r",stdin); 26 // freopen("out.txt","w",stdout); 27 while(scanf("%s",input)!=EOF&&input[0]!='#'){ 28 int n=0; 29 for(char ch='A';ch<='Z';ch++){//输入处理 30 if(strchr(input,ch)!=NULL){ 31 id[ch]=n++; 32 letter[id[ch]]=ch; 33 } 34 35 } 36 37 int len=strlen(input),p=0,q=0; 38 vector<int> u,v; 39 40 for(;;){ 41 while(p<len&&input[p]!=':') p++; 42 if(p==len) break; 43 while(q<len&&input[q]!=';') q++; 44 45 for(int i=p+1;i<q;i++){ 46 u.push_back(id[input[p-1]]); 47 v.push_back(id[input[i]]); 48 } 49 50 p++;q++;//都向后挪一位,不挪的话,p位置一直是‘:’,q位置一直是';',就超时了 51 } 52 53 54 int P[maxn],bestP[maxn],pos[maxn],ans=n; 55 56 for(int i=0;i<n;i++) P[i]=i; 57 do{ 58 for(int i=0;i<n;i++) pos[P[i]]=i;//记录下在这个排列中的位置 59 60 int bandwidth=0; 61 62 for(int i=0;i<u.size();i++) 63 bandwidth=max(bandwidth,abs(pos[u[i]]-pos[v[i]]));//求出当前的带宽 64 65 if(bandwidth<ans){//维护一个最小的带宽的值,并保存下此时的排列 66 ans=bandwidth; 67 memcpy(bestP,P,sizeof(P)); 68 } 69 } while(next_permutation(P,P+n)); 70 71 72 for(int i=0;i<n;i++) printf("%c ",letter[bestP[i]]); 73 printf("-> %d\n",ans); 74 } 75 return 0; 76 77 }
View Code
转载于:https://www.cnblogs.com/wuyuewoniu/p/4467008.html
UVa 140 Bandwidth【枚举排列】相关推荐
- Uva 140 Bandwidth
基本思路是暴力枚举,思考一下可以发现,可以跳过一下情况.对于目前最小的minBW,每次枚举一种排列计算bandwidth进行比较,如果大于当前minBW已经可以断定这个排列已经不可能是最好的解了. 而 ...
- 简单枚举 / 枚举排列
本文参考<算法竞赛入门经典>第七章<暴力枚举法>,提出的是暴力"列举"出所有可能性并一一试验的方法. 目录 1 简单枚举 2 枚举排列 2.1 生成1~n的 ...
- UVa 729 The Hamming Distance Problem【枚举排列】
题意:给出数组的长度n,给出h,表示这个数组里面含有h个1,求其所有的排列 用next_permutation就可以了 1 #include<iostream> 2 #include< ...
- 暴力求解法 之 枚举排列
1.生成1~n的排列 #include<stdio.h> #include<string.h> const int N=1e3+10; int a[N]; void print ...
- UVa LA 4253 UVa 1421 Archery 枚举,状态削减,oj错误题目 难度: 1
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- 模版 ----- 一维指数型枚举 排列型枚举 组合型枚举
文章目录 一维指数型枚举 一.01型枚举 应用场景 递归树模型 时间复杂度 代码模版 应用 二.滑动型枚举 应用场景 递归树模型 时间复杂度 代码模版 排列型枚举 应用场景 递归树模型 时间复杂度分析 ...
- 140:Bandwidth
Bandwidth 注意节点不一定是按字母表顺序从前到后用的,也有可能是A C 却没用B,因为这个TLE了好几次.. #include<bits/stdc++.h> using names ...
- 算法竞赛入门经典读书笔记(三)7.2枚举排列
7.2.1生成1~n的所有排列 递归调用的方法可以实现. [cpp] view plaincopy #include <iostream> using namespace std; voi ...
- 【NOIP2004】【Luogu1088】火星人(枚举排列)
problem 给定一个长为n的排列 求他的后面的第m个排列 n<1e4,m<100 solution C++STL的next_permutation了解一下,复杂度O(n)的. 全题复杂 ...
最新文章
- 【组队学习】【23期】Datawhale深度推荐模型
- 图形描述语言GraphML(3):图形元数据
- 【数据结构与算法】之深入解析“最长公共前缀”的求解思路与算法示例
- 线性直接变换方法对摄像机进行标定
- 140种Python标准库、第三方库和外部工具都有了
- java8新特性(7)— Base64
- EmptyPage(空白页组件)原理与使用
- 模拟退火(bzoj 3680: 吊打XXX)
- YouCompleteMe自动补全的安装配置与使用
- 计算机地址聚合,cidr怎么算?cidr地址聚合快速算法
- OSX: Mac不睡眠的排查
- dnf新起号怎么才不出人脸_教你如何快速养成一个新号 新角色速成教学
- android多开原理和检测。
- 数学专业英语--极限
- 期货什么情况下会强制平仓
- 服务器响应到客户端中文乱码的解决方式
- BackTrack安装
- android 直播悬浮窗口,实战:快手直播伴侣 解决安卓悬浮窗/闪退等问题
- 如何在K8S上备份和恢复MySQL
- 使用正则 去除标签, 提取HTML 纯文本
热门文章
- 物联网设备感染Mirai病毒发起的DDoS攻击
- 面向小姐姐的编程——JAVA面向对象之继承(三)
- linux7squid编译安装,CentOS 7.3 源码安装squid 4.12 及安装过程遇到的一些问题
- mysql5.7.17免安装版_MySql 5.7.17免安装配置
- mysql 查询两张表结构相同的数据库_数据库原理习题(含答案)
- xml 纯内容标签_Python小课堂XML 解析
- 图像处理-二值形态学运算
- oracle把两个字段拼接在一起,请问Oracle中两个日期拼接在一起的语句应该怎么写?...
- java log4j 热部署_JAVA类加载器分析--热部署的缺陷(有代码示例,及分析)
- python和c#交互_python与C#的互相调用