UVA 140_Bandwidth
题意:
定义一个结点的带宽是其距离所有相连结点的最远距离,一个图的带宽是图中所有结点带宽的最小值。给出一个图中各个结点的相邻情况,要求写出一个结点的排列,使得其所构成的图带宽最小。
分析:
枚举全排列+剪枝
注意:
- 输入时的处理
- 虽然结点个数不超过8个但是结点可以是26个字母中的任意一个!
- 孤立结点的情况
代码:
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100;
int s[maxn], d[maxn],result[maxn], id[maxn], aa[maxn];;
int n, maxd = 0, mind = 30;
pair <char,char>pa[maxn];
vector<int>m[maxn];
int main (void)
{
char str[maxn];
scanf("%s",str);
while(str[0]!='#'){
for(int i=0; i < maxn; i++) vector<int>().swap(m[i]);
memset(aa,0,sizeof(aa));
int flag = 1,k = 0;
n=0, maxd = 0, mind = 20;
char t;
for(int i = 0; i < strlen(str); i++){
if(str[i]==';') flag=1;
else if(str[i]==':') flag=0;
else{
if(aa[str[i]-'A']==0){
id[n++] = str[i]-'A';
aa[str[i]-'A']=1;
}
if(flag==1) t=str[i];
else if(flag==0) pa[k++]=make_pair(str[i],t);
}
}
sort(id, id+n);
for(int i = 0; i < k; i++){
int a = pa[i].first-'A';
int b = pa[i].second-'A';
if(find(m[a].begin(),m[a].end(),b)==m[a].end()) m[a].push_back(b);
if(find(m[b].begin(),m[b].end(),a)==m[b].end()) m[b].push_back(a);
}
for(int i = 0; i < n; i++) s[i] = id[i];
do{
maxd = 0;
for(int i = 0; i < n; i++) d[s[i]] =i;
for(int j = 0; j < n; j ++){
for(int i = 0; i <m[id[j]].size(); i++){
if(d[m[id[j]][i]]-d[id[j]]>0)
maxd = max(maxd, d[m[id[j]][i]]-d[id[j]]);
}
if(maxd>mind) break;
}
if(mind>maxd){
mind=maxd;
for(int i = 0; i < n; i++) result[i]=s[i];
}
}while(next_permutation(s,s+n));
for(int i = 0; i < n; i++) printf("%c ",result[i]+'A');
printf("-> %d\n", mind);
scanf("%s",str);
}
}
爱上pair
好多地方处理的还是笨呼呼
UVA 140_Bandwidth的更多相关文章
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- UVA&&POJ离散概率与数学期望入门练习[4]
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...
- UVA计数方法练习[3]
UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...
- UVA数学入门训练Round1[6]
UVA - 11388 GCD LCM 题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小 g不能整除l时无解,否则一定g,l最小 #include &l ...
- UVA - 1625 Color Length[序列DP 代价计算技巧]
UVA - 1625 Color Length 白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束 和模拟赛那道环形DP很想,计算这 ...
- UVA - 10375 Choose and divide[唯一分解定理]
UVA - 10375 Choose and divide Choose and divide Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- UVA - 11584 Partitioning by Palindromes[序列DP]
UVA - 11584 Partitioning by Palindromes We say a sequence of char- acters is a palindrome if it is t ...
随机推荐
- Uediter的引用和取值
页面应用Uediter控件,代码如下: <tr> <td align="center" class="xwnr_j"> <asp: ...
- Django系列:(1)PyCharm下创建并运行我们的第一个Django工程
准备工作: 假设读者已经安装好python 2x或3x,以及安装好Django,以及Pycharm. 我的配置: – Python 2.7.11 – Pycharm Professional 5.0. ...
- git ---理论知识
理论基础: 不要高估自己的智商,不要低估Git的能耐. 1.Git记录的 是什么? 记录每一次版本变动的内容 将每个版本独立保存 方便分支管理. 2.git的三棵树---工作区.暂存区域和Git仓库 ...
- 掌握Spark机器学习库-06-基础统计部分
说明 本章主要讲解基础统计部分,包括基本统计.假设检验.相关系数等 数据集 数据集有两个文件,分别是: beijing.txt 北京历年降水量,不带年份 beijing2.txt 北京历年降水量,带年 ...
- iOS - 事件处理全过程(补充)
事件处理的完整过程 1> 先将事件对象由上往下传递(由父控件传递给子控件),找到最合适的控件来处理这个事件. 2> 调用最合适控件的touches….方法 3> 如果调用了[supe ...
- PHP serialize() 序列化函数
PHP serialize() 序列化函数 定义和用法 — 语法 string serialize ( mixed $value ) serialize() 返回字符串,此字符串包含了表示 value ...
- 关于NSCELL
作为一个初学者,我一直很弄不明白NSCell的子类,比如,NSButtonCell,NSImageCell及其对应的控件之间的关系.今天,在做一个TableView实现的时候,我终于开始有点悟了——好 ...
- RequireJS 上手使用
首先 点击此处 得到requirejs. 捣鼓了俩小时终于运行成功了,原因是因为require(['我是空格underscore',...],function(){...})的时候 变量多个空格(坑爹 ...
- java中属性命名get字母大小写问题
java文件 company.java private int sTime; public void setSTime (int sTime) { this.sTime = sTime; ...
- numpy调试
x1 = np.arange(9.0) 结果就是: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8.]) 拿这个来初始化进行调试