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 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的更多相关文章
- UVa140 Bandwidth 小剪枝+双射小技巧+枚举全排列+字符串的小处理
给出一个图,找出其中的最小带宽的排列.具体要求见传送门:UVa140 这题有些小技巧可以简化代码的编写. 本题的实现参考了刘汝佳老师的源码,的确给了我许多启发,感谢刘老师. 思路: 建立双射关系:从字 ...
- Uva140 Bandwidth 全排列+生成测试法+剪枝
参考过仰望高端玩家的小清新的代码... 思路:1.按字典序对输入的字符串抽取字符,id[字母]=编号,id[编号]=字母,形成双射 2.邻接表用两个vector存储,存储相邻关系 ...
- 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 ...
- UVa140 Bandwidth 【最优性剪枝】
题目链接:https://vjudge.net/contest/210334#problem/F 转载于:https://www.cnblogs.com/luruiyuan/p/5847706.ht ...
- 递归回溯 UVa140 Bandwidth宽带
本题题意:寻找一个排列,在此排序中,带宽的长度最小(带宽是指:任意一点v与其距离最远的且与v有边相连的顶点与v的距离的最大值),若有多个,按照字典序输出最小的哪一个. 解题思路: 方法一:由于题目说结 ...
- UVA-140 Bandwidth (回溯+剪枝)
题目大意:求一个使带宽最小的排列和最小带宽.带宽是指一个字母到其相邻字母的距离最大值. 题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个.一.当前解不如最优解优时,减去:二.预测的理想解不必最 ...
- 7-6 Bandwidth UVA140
没有清空向量导致debug了好久 这题难以下手 不知道怎么dfs 原来是用排序函数. letter[n]=i; id[i]=n++; 用来储存与设置标记十分巧妙 for(;;) { while(s[ ...
- 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 ...
- Propagation of Visual Entity Properties Under Bandwidth Constraints
1. Introduction The Saga of Ryzom is a persistent massively-multiplayer online game (MMORPG) release ...
随机推荐
- ArcEngine 通过SpatialRelDescription删除不相交要素
ISpatialFilter.SpatialRel设置为esriSpatialRelRelate,并且设置SpatialRelDescription为某个字符串.该字符串的构造方法:该字符串为长度为9 ...
- markdown插件学习
1.Markdown的定义 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式.它用简洁的语法代替排版,而不像一般我们用的字处理软件Wo ...
- C# 中对WinForm窗体中的控件快速设置TableIndex次序
点击“视图”--“Tab键顺序”,然后便可设置.
- android学习——MeasureSpec介绍及使用
一.MeasureSpc类说明 SDK的介绍:MeasureSpc类封装了父View传递给子View的布局(layout)要求.每个MeasureSpc实例代表宽度或者高度 它有三种模式:①.UNSP ...
- C# winform打印总结 z
http://blog.csdn.net/jing_xin/article/details/41444063 针对BEIYANG收据打印机 BTP-R580测试通过. 操作说明:http://www. ...
- 因為 Hypervisor 未執行,所以無法啟動虛擬機器
bcdedit /set hypervisorlaunchtype auto https://technet.microsoft.com/zh-tw/magazine/2009.02.hyperv.a ...
- Golang官方图片库
Golang 的图片出来通过提供操作每一个像素点设置颜色(http://www.cnblogs.com/ghj1976/p/3441536.html) 和 提供通过可选蒙版图片重叠操作 (http:/ ...
- 【转】linux之mkfs/mke2fs格式化
转自:http://blog.csdn.net/andyhooo/article/details/5321584 mkfs [root@www ~]# mkfs [-t 檔案系統格式] 裝置檔名 選項 ...
- Linux man命令数字含义
1,用户在shell环境中可以操作的命令或可执行文件 2,系统内核可调用的函数与工具等,即由内核提供的函数. 如open,write之类的(通过这个,可以很方便的查到调用这个函数时需要加什么头文件 ...
- SNIFFER问题集锦
SNIFFER相关教程下载: Sniffer使用教程.pdf|Sniffer用法.ppt 具体问题解决: 1.SNIFFER4.75无法使用,打开后提示 No adapter is binding t ...