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. 看来ms sql server if 中定义个变量出了if 还是可以用的

    begin declare @abc int; end print @abc 可以打出1出来

  2. 利用命令控制台cmd进入某个硬盘的某个文件夹的命令是什么?

    在命令行窗口中输入F:后回车就可以切换到F盘,如果想查看F盘的内容,可以再输入dir后回车 (输入“F”后要再输入一个“ :”再回车才行哦)

  3. Ubuntu 下安装 使用 QQ

    在Ubuntu下使用QQ显得高端大气了.界面也清爽多了. 一: 首先得下一个WineQQ,不用找了地址在这里: http://pan.baidu.com/share/link?shareid=3303 ...

  4. HP Web Tours分析

    1.启动Web Tours 2.首页结构 3.预定机票

  5. eclipse 报错汇总

    1.Eclipse 启动时,报错: Fail to create the java virtual machine   已解决.方法:eclipse.ini 中-vmargs-Dosgi.requir ...

  6. WebGoat学习——跨站脚本攻击(Cross‐Site Scripting (XSS))

    跨站脚本攻击(Cross‐Site Scripting (XSS)) XSS(Cross Site Script)跨站脚本攻击.是指攻击者向被攻击Web 页面里插入恶意html代码,当用户浏览该页之时 ...

  7. enter mysql

    1, mysql -u database username -p 2, database password 3, use (database name) -> change database 4 ...

  8. kali ssh 登录

    kali 开启ssh 登录:可在windows 中通过 xshell 登录,方便操作. 修改sshd_config文件, vi /etc/ssh/sshd_config 将#PasswordAuthe ...

  9. QQ群聊天记录文件分割

    嗯,如题 是个蛋疼物 目前QQ的聊天记录导出功能很让人郁闷 三种聊天记录格式的导出 1  TXT   没图 2  BAK  只能再导入QQ使用 3  MHT 有图有字,缺点是一旦聊天记录很多,文件体积 ...

  10. DNN 错误代码 0x80070005 解决方案

    在IIS上创建DNN站点,可能出现的错误代码:0x80070005,因为权限不足而不能访问DNN. 解决方法:打开IIS, 1.右键目标网站->编辑权限->安全->添加组或者用户 “ ...