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 ...
随机推荐
- 删除特定影响因素(字段列)下的重复记录(MySQL)
;CREATE TABLE TabTest ( `id` ) NOT NULL AUTO_INCREMENT ,`factorA` ) NOT NULL DEFAULT ' ' ,`factorB` ...
- netbeans中wicket插件对应的jQuery-ui版本
在netbean里使用wicket,我们经常习惯使用netbeans自带的wicket插件直接安装wicket,但是因为netbean上的 wicket插件版本比较老,使得我们很多新的第三方wicke ...
- JS方式调用本地的可执行文件
看到一个方法,有些用,先存下来,有用的时候再用. 前几天,在IE,FIREFOX中实现了用JS方式调用本地的可执行文件.地址:www.yihaomen.com/article/js/211.htm , ...
- 部署WAR文件到tomcat
1.启动tomcat服务 2.在浏览器的地址栏输入地址“http://localhost:8080/manager/html”进入tomcat管理界面. 如果要管理的服务器是在网络中,则将localh ...
- 1005acm罚时
ACM国际大学生程序设计竞赛是由国际计算机学会主办的,一项旨在展示大学生创新能力.团队精神和在压力下编写程序.分析和解决问题能力的年度竞赛.参赛队伍最多由三名参赛队员组成,竞赛中一般命题10-13题, ...
- 非阻塞式socket的select()用法
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只 是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程 ...
- pku3659 Cell Phone Network
http://poj.org/problem?id=3659 树状DP,树的最小点覆盖 #include <stdio.h> #include <vector> #define ...
- AS3垃圾回收整理
AS3垃圾回收整理 转自 http://bbs.wefdc.com/thread-2366-1-1.html 来源页面: http://www.adobe.com/devnet/actionscrip ...
- JIT(动态编译)和AOT(静态编译)编译技术比较
Java 应用程序的性能经常成为开发社区中的讨论热点.因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标,早期 Java 运行时所提供的性能级别远低于 C 和 C++ 之类的编译语言.尽管 ...
- Java ClassLoader 原理详细分析
一.什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程 ...