Bandwidth

Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an ordering on the elements in V, then the bandwidth of a node v is defined as the maximum distance in the ordering between v and any node to which it is connected in the graph. The bandwidth of the ordering is then defined as the maximum of the individual bandwidths. For example, consider the following graph:

This can be ordered in many ways, two of which are illustrated below:

For these orderings, the bandwidths of the nodes (in order) are 6, 6, 1, 4, 1, 1, 6, 6 giving an ordering bandwidth of 6, and 5, 3, 1, 4, 3, 5, 1, 4 giving an ordering bandwidth of 5.

Write a program that will find the ordering of a graph that minimises the bandwidth.

Input

Input will consist of a series of graphs. Each graph will appear on a line by itself. The entire file will be terminated by a line consisting of a single #. For each graph, the input will consist of a series of records separated by `;'. Each record will consist of a node name (a single upper case character in the the range `A' to `Z'), followed by a `:' and at least one of its neighbours. The graph will contain no more than 8 nodes.

Output

Output will consist of one line for each graph, listing the ordering of the nodes followed by an arrow (->) and the bandwidth for that ordering. All items must be separated from their neighbours by exactly one space. If more than one ordering produces the same bandwidth, then choose the smallest in lexicographic ordering, that is the one that would appear first in an alphabetic listing.

Sample input

A:FB;B:GC;D:GC;F:AGH;E:HD
#

Sample output

A B C F G D H E -> 3

 

题意:给一个最多8个结点的无向图,把结点重排后对于图中每条边(u,v),u和v在排列中的最大距离称为该排列的带宽。求带宽最小的排列

算法:枚举全排列。需要注意的是本题的输入格式相对麻烦一点,需要仔细应对

学习点:

1. id和letter的映射关系处理

2. strtok函数使用方法

3.for(int i=0;i<n;i++) pos[P[i]]=i; 确认排列中元素位置

 

#include<cstdio>
#include<cstring>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=10;
int id[256], letter[maxn];
int n; void map_id_letter(char *p)
{
n=0;
for(int c='A'; c<='Z'; c++) if(strchr(p, c))
{
id[c]=n;
letter[n]=c;
n++;
}
} int main()
{
char buff[256];
while(gets(buff) && buff[0]!='#')
{
map_id_letter(buff);
char*p=strtok(buff, ";");
vector<int> u,v;
while(p)
{
//printf("%s\n", p);
int t=p[0];
++p;//跳过:
while(*(++p))
{
u.push_back(id[t]);
v.push_back(id[*p]);
}
p=strtok(0, ";");
} int ans=n;
int P[maxn], bestP[maxn], pos[maxn];
for(int i=0;i<n;i++) P[i]=i;
do
{
for(int i=0;i<n;i++) pos[P[i]]=i;
int bandwidth=0;
for(int i=0;i<u.size();i++)
{
bandwidth=max(bandwidth, abs(pos[u[i]] - pos[v[i]]));
}
if(bandwidth<ans)
{
ans=bandwidth;
memcpy(bestP, P, sizeof(P));
}
}while(next_permutation(P, P+n)); for(int i=0;i<n;i++)
{
printf("%c ", letter[bestP[i]]);
}
printf("-> %d\n", ans);
} return 0;
}

 

回溯加剪枝方法,更快:

#include<cstdio>
#include<cstring>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=10;
int id[256], letter[maxn];
int n; void map_id_letter(char *p)
{
n=0;
for(int c='A'; c<='Z'; c++) if(strchr(p, c))
{
id[c]=n;
letter[n]=c;
n++;
}
} int vis[maxn];
int ans;
int P[maxn], bestP[maxn], pos[maxn];
int edge[27][27]; //生成排列
void gen(int d, int bw)
{
if(d==n)
{
ans=bw;
memcpy(bestP, P, sizeof(P));
return;
} for(int i=0;i<n;i++)
{
if(!vis[i])
{
vis[i]=1;
P[d]=i;
//如果新加的节点带宽大于现有带宽,剪枝
int w=0;//新加节点带宽
for(int j=0;j<d;j++)
{
if(edge[i][P[j]])
{
w=d-j;
break;
}
}
int cur_bw=max(bw, w);
if(cur_bw<ans)
gen(d+1, cur_bw);
vis[i]=0;
}
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("./uva140.in", "r", stdin);
#endif
char buff[256];
while(gets(buff) && buff[0]!='#')
{
map_id_letter(buff);
char*p=strtok(buff, ";");
memset(edge, 0, sizeof(edge));
while(p)
{
int t=p[0];
++p;//跳过:
while(*(++p))
{
edge[id[t]][id[*p]]=1;
edge[id[*p]][id[t]]=1;
}
p=strtok(0, ";");
} ans=n;
gen(0, 0); for(int i=0;i<n;i++)
{
printf("%c ", letter[bestP[i]]);
}
printf("-> %d\n", ans);
} return 0;
}

uva140 - Bandwidth的更多相关文章

  1. UVa140 Bandwidth 小剪枝+双射小技巧+枚举全排列+字符串的小处理

    给出一个图,找出其中的最小带宽的排列.具体要求见传送门:UVa140 这题有些小技巧可以简化代码的编写. 本题的实现参考了刘汝佳老师的源码,的确给了我许多启发,感谢刘老师. 思路: 建立双射关系:从字 ...

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

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

  3. UVA140 ——bandwidth(搜索)

    Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an ordering on the ...

  4. UVa140 Bandwidth 【最优性剪枝】

    题目链接:https://vjudge.net/contest/210334#problem/F  转载于:https://www.cnblogs.com/luruiyuan/p/5847706.ht ...

  5. 递归回溯 UVa140 Bandwidth宽带

    本题题意:寻找一个排列,在此排序中,带宽的长度最小(带宽是指:任意一点v与其距离最远的且与v有边相连的顶点与v的距离的最大值),若有多个,按照字典序输出最小的哪一个. 解题思路: 方法一:由于题目说结 ...

  6. UVA-140 Bandwidth (回溯+剪枝)

    题目大意:求一个使带宽最小的排列和最小带宽.带宽是指一个字母到其相邻字母的距离最大值. 题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个.一.当前解不如最优解优时,减去:二.预测的理想解不必最 ...

  7. 7-6 Bandwidth UVA140

    没有清空向量导致debug了好久 这题难以下手  不知道怎么dfs 原来是用排序函数. letter[n]=i; id[i]=n++; 用来储存与设置标记十分巧妙 for(;;) { while(s[ ...

  8. uva 140 bandwidth (好题) ——yhx

     Bandwidth  Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an orde ...

  9. Propagation of Visual Entity Properties Under Bandwidth Constraints

    1. Introduction The Saga of Ryzom is a persistent massively-multiplayer online game (MMORPG) release ...

随机推荐

  1. 如何用HTML5+PhoneGap写个Path项目

    最近Path这个应用很火爆,网上也出现了不少仿Path菜单的项目.即使在原生APP里边,Path的效果也是非常赞的.我突然想,Web APP是不是也能做出类似Path那样的效果呢?于是就有了OPath ...

  2. php curl简单使用

    使用PHP的cURL库可以简单和有效地去抓网页,您只需要运行一个脚本,然后分析一下您所抓取的网页,然后就可以以程序的方式得到您想要的数据了.无论是您想从一个链接上取部分数据,或是取一个XML文件并把其 ...

  3. shell下,进程的前台与后台运行

    跟系统任务相关的几个命令:fg.bg.jobs.&.ctrl+z1. & 最经常被用到   这个用在一个命令的最后,可以把这个命令放到后台执行2. ctrl + z     可以将一个 ...

  4. ueditor-百度编辑器插件

    1.官网地址:http://ueditor.baidu.com/website/index.html 2.定制化工具栏:(1)修改ueditor.config.js的toolsbar(2)在创建编辑器 ...

  5. Android开发中这些小技巧

    http://blog.csdn.net/guxiao1201/article/details/40655661 http://blog.csdn.net/guxiao1201/article/det ...

  6. hdu 2602 Bone Collector(01背包)

    题意:给出包裹的大小v,然后给出n块骨头的价值value和体积volume,求出一路下来包裹可以携带骨头最大价值 思路:01背包 1.二维数组(不常用 #include<iostream> ...

  7. c++中实现委托

    成员函数指针与高性能的C++委托(上篇) 撰文:Don Clugston 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(clo ...

  8. 将垃圾送入无底洞,顺便整理dev知识

    相信用过Linux的童鞋们都用过crontab来做定时任务,不需要额外的安装程序和配置,一条简单的语句搞定定时任务,但是小伙伴们发现了没,如果你的定时任务执行频率很高而且会产生大量的输出的话,你的老爷 ...

  9. 镜头覆盖范围FOV 的规划与FOV去四角

    本文纲要: 规划FOV的原因 FOV去四角 简单的声明 FOV查找思路 查找FOV的代码 TNoFourCornersRect结构及Contains函数 判断两个矩形是否相交 延伸与拓展 本文内容: ...

  10. Epic - Seed Number

    Find the seed of a number. Eg : 1716 = 143*1*4*3 =1716 so 143 is the seed of 1716. find all possible ...