UVA 140 Bandwidth (dfs 剪枝 映射)
题意:
给定一个n个结点的图G和一个结点的排列, 定义结点i的带宽b(i)为i和相邻结点在排列中的最远距离, 所有b(i)的最大值就是这个图的带宽, 给定G, 求让带宽最小的结点排列。

给定的图 n <=8, 字母包含A~Z

上图是两种排列, 图1 各个b(i) 为 6 6 1 4 1 1 6 6 最大值为6 图2 b(i)为 5 3 1 4 3 5 1 4 最大值为 5
本图答案应为 A B C F G D H E
b(i)为3 3 3 3 2 3 3 3, 最大值为3.
分析:
首先本题输入格式是那种给出一行,然后比较繁琐的题目, 所以可以考虑先读入一行再进行处理会比边读边处理好一点。
读入后第一要确认的就是这个图包含哪些字母, 因为本题需要全排列并按字典序输出, 所以最好把字母先映射为id, 这里使用了,strchr(const char* , char), 该函数可返回字符串中char第一次出现的位置, 不包含该ch则返回NULL。

并把编号由大到小写到letter中, 那么只需要生成这些id的全排列, 就能知道这些字母的全排列。
第二步是建图, 把输入中有用的信息提炼出来, 那么就可以用邻接矩阵建图了,不使用邻接表是因为本题输入会有重边。

然后就可以dfs生成全排列了, 这里我只用了一个剪枝, 就是搜索到结点u时, 如果u有m个相邻结点,而且有last(m-已经选中的结点)个还没被我前面的递归选中, 那么如果last > 当前最优带宽k, 就可以剪枝。 因为对于结点u而言, 最理想情况是这last个结点紧跟在u后, 这样结点带宽为m, 如果m >= 目前已经找到最优带宽k , 剪枝是合理的。

#include<bits/stdc++.h>
using namespace std;
char input[];
int id[], letter[], node[], temp[], best_wid[];
int adj[][];
int cnt = ;
int min_wid = 1e5;
bool vis[];
int pos[];
void dfs(int dep){
if(dep == cnt){
int t_wid = -, pp_wid = -;
for(int i = ; i < cnt; i++){
pp_wid = -;
for(int j = ; j < cnt; j++){
if(adj[i][j]){
pp_wid = max(pp_wid, abs(pos[i] - pos[j]) );
}
}
t_wid = max(t_wid, pp_wid);
}
if(t_wid < min_wid){
for(int i = ; i < cnt; i++){
best_wid[i] = temp[i];
}
min_wid = t_wid;
}
}
else{
for(int i = ; i < cnt; i++){
if(!vis[i]){
int last = ;
for(int j = ; j < cnt; j++)
{
if(adj[i][j]){
int ok = ;
for(int k = ; k < dep; k++){
if(temp[k] == j) { ok = ; break;}
}
if(ok) last ++;
}
}
if(last >= min_wid)
continue;
vis[i] = ;
temp[dep] = i;
pos[temp[dep]] = dep;
dfs(dep+);
vis[i] = ;
}
}
}
}
int main()
{
while(scanf("%s", input) && input[] != '#'){
memset(adj,,sizeof(adj));
cnt = , min_wid = 1e5;
for(char a = 'A'; a <= 'Z'; a++){
if(strchr(input, a)){
id[a] = cnt++;
letter[id[a]] = a;
}
}
int len = strlen(input), p=, q=;
while(){
while(p < len && input[p]!= ':')
p++;
if(p == len) break;
while(q < len && input[q]!= ';')
q++;
// p定位: q定位;
for(int i = p+; i < q; i++){
adj[id[input[p-]]][id[input[i]]] = ;
adj[id[input[i]]][id[input[p-]]] = ;
}
p++, q++;
} dfs();
for(int i = ; i < cnt; i++){
printf("%c ", letter[best_wid[i]]);
}
printf("-> %d\n", min_wid);
}
return ;
}
UVA 140 Bandwidth (dfs 剪枝 映射)的更多相关文章
- Sticks(UVA - 307)【DFS+剪枝】
Sticks(UVA - 307) 题目链接 算法 DFS+剪枝 1.这道题题意就是说原本有一些等长的木棍,后来把它们切割,切割成一个个最长为50单位长度的小木棍,现在想让你把它们组合成一个个等长的大 ...
- 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 ...
- UVa 140 Bandwidth【枚举排列】
题意:给出n个节点的图,和一个节点的排列,定义节点i的带宽b[i]为i和其相邻节点在排列中的最远的距离,所有的b[i]的最大值为这个图的带宽,给一个图,求出带宽最小的节点排列 看的紫书,紫书上说得很详 ...
- UVA 140 Bandwidth
题意: 给出一个n个节点的图G,和一个节点的排列,定义节点i的带宽为i和相邻节点在排列中的最远距离,而所有带宽的最大值就是图的带宽,求让图的带宽最小的排列. 分析: 列出所有可能的排列,记录当前找到的 ...
- UVA - 140 Bandwidth(带宽)(全排列)
题意:给定图,求是带宽最小的结点排列. 分析:结点数最多为8,全排列即可.顶点范围是A~Z. #pragma comment(linker, "/STACK:102400000, 10240 ...
- *HDU1455 DFS剪枝
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- POJ 3009 DFS+剪枝
POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...
- poj 1724:ROADS(DFS + 剪枝)
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10777 Accepted: 3961 Descriptio ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
随机推荐
- bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=110 传送门2:http://www.lydsy.com/JudgeOn ...
- Tree CodeForces -932D
错误记录:如下注释语句 #include<cstdio> #include<algorithm> using namespace std; typedef long long ...
- 191 Number of 1 Bits 位1的个数
编写一个函数,输入是一个无符号整数,返回的是它所有 位1 的个数(也被称为汉明重量).例如,32位整数 '11' 的二进制表示为 00000000000000000000000000001011,所以 ...
- jdk 1.8下 java ArrayList 添加元素解析
转载请注明http://www.cnblogs.com/majianming/p/8006452.html 有人问我,java ArrayList底层是怎么实现的?我就回答数组,他再问我,那它是怎么实 ...
- VMware虚拟机中涉及的3种常见网络模式
桥接模式.这种模式下,虚拟机和物理机连的是同一个网络,虚拟机和物理机是并列关系,地位是相当的.比如你家如果有用路由器,那么你的电脑和你的手机同时连接这个路由器提供的Wi-Fi,那么它们的关系就是这种模 ...
- GatewayWorker+Laravel demo
GatewayWorker 结合 Laravel 使用的简单案例,重点是在Laravel中使用GatewayClient发送消息 主要流程:GatewayWorker主要负责推送消息给客户端但不接受客 ...
- 《Hadoop高级编程》之为Hadoop实现构建企业级安全解决方案
本章内容提要 ● 理解企业级应用的安全顾虑 ● 理解Hadoop尚未为企业级应用提供的安全机制 ● 考察用于构建企业级安全解决方案的方法 第10章讨论了Hadoop安全性以及Hado ...
- 用RecyclerView做一个小清新的Gallery效果
一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...
- MSSQL数据库事务处理
在日常应用中通常需要多人执行多表的操作,比如售票系统的售票功能,这时候就涉及到数据读取的一致性问题,好在MSSQL数据库也提供了事务处理功能,这里就简单的记下 语法: Begin Tran //事务处 ...
- Node.js——环境变量