题意:给出n个节点的图,和一个节点的排列,定义节点i的带宽b[i]为i和其相邻节点在排列中的最远的距离,所有的b[i]的最大值为这个图的带宽,给一个图,求出带宽最小的节点排列

看的紫书,紫书上说得很详细--

看标程的时候算每个图的带宽的时候看了好久,原来是这样的

打印出u[i],v[i]的值就知道了

样例:

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

对于每一个u[i],v[i],abs(u[i]-v[i])就是相邻节点之间的距离, 再在这里面找出最大值

 #include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) typedef long long LL;
const int INF = (<<)-;
const int mod=;
const int maxn=; char input[maxn];
int id[maxn],letter[maxn]; int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
while(scanf("%s",input)!=EOF&&input[]!='#'){
int n=;
for(char ch='A';ch<='Z';ch++){//输入处理
if(strchr(input,ch)!=NULL){
id[ch]=n++;
letter[id[ch]]=ch;
} } int len=strlen(input),p=,q=;
vector<int> u,v; for(;;){
while(p<len&&input[p]!=':') p++;
if(p==len) break;
while(q<len&&input[q]!=';') q++; for(int i=p+;i<q;i++){
u.push_back(id[input[p-]]);
v.push_back(id[input[i]]);
} p++;q++;//都向后挪一位,不挪的话,p位置一直是‘:’,q位置一直是';',就超时了
} int P[maxn],bestP[maxn],pos[maxn],ans=n; for(int i=;i<n;i++) P[i]=i;
do{
for(int i=;i<n;i++) pos[P[i]]=i;//记录下在这个排列中的位置 int bandwidth=; for(int i=;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=;i<n;i++) printf("%c ",letter[bestP[i]]);
printf("-> %d\n",ans);
}
return ; }

UVa 140 Bandwidth【枚举排列】的更多相关文章

  1. 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 ...

  2. UVA 140 Bandwidth

    题意: 给出一个n个节点的图G,和一个节点的排列,定义节点i的带宽为i和相邻节点在排列中的最远距离,而所有带宽的最大值就是图的带宽,求让图的带宽最小的排列. 分析: 列出所有可能的排列,记录当前找到的 ...

  3. UVA - 140 Bandwidth(带宽)(全排列)

    题意:给定图,求是带宽最小的结点排列. 分析:结点数最多为8,全排列即可.顶点范围是A~Z. #pragma comment(linker, "/STACK:102400000, 10240 ...

  4. UVA 140 Bandwidth (dfs 剪枝 映射)

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

  5. 蓝桥杯 2014本科C++ B组 六角填数 枚举排列

    标题:六角填数 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填 ...

  6. poj 2585 Window Pains 暴力枚举排列

    题意: 在4*4的格子中有9个窗体,窗体会覆盖它之下的窗体,问是否存在一个窗体放置的顺序使得最后的结果与输入同样. 分析: 在数据规模较小且不须要剪枝的情况下能够暴力(思路清晰代码简单),暴力一般分为 ...

  7. UVa 725 Division (枚举)

    题意 : 输入正整数n,按从小到大的顺序输出所有形如abcde/fghij = n的表达式,其中a-j恰好为数字0-9的一个排列(可以有前导0),2≤n≤79. 分析 : 最暴力的方法莫过于采用数组存 ...

  8. UVa 140 (枚举排列) Bandwidth

    题意较复杂,请参见原题=_=|| 没什么好说的,直接枚举每个排列就好了,然后记录最小带宽,以及对应的最佳排列. STL里的next_permutation函数真是好用. 比较蛋疼的就是题目的输入了.. ...

  9. UVa 216 Getting in Line【枚举排列】

    题意:给出n个点的坐标,(2<=n<=8),现在要使得这n个点连通,问最小的距离的和 因为n很小,所以可以直接枚举这n个数的排列,算每一个排列的距离的和, 保留下距离和最小的那个排列就可以 ...

随机推荐

  1. MySQL超级简明基本操作攻略,给自己看(一)

    系统:Ubuntu 14.04 LTS 安装: apt-get install mysql //安装数据库 apt-get install mysql-workbench //安装图形界面 使用: 启 ...

  2. node21---mongoose

    01.js //引包 var mongoose = require('mongoose'); //创建一个数据库连接 mongoose.connect('mongodb://localhost/tes ...

  3. 基于FPGA的跨时钟域信号处理——专用握手信号

    在逻辑设计领域,只涉及单个时钟域的设计并不多.尤其对于一些复杂的应用,FPGA往往需要和多个时钟域的信号进行通信.异步时钟域所涉及的两个时钟之间可能存在相位差,也可能没有任何频率关系,即通常所说的不同 ...

  4. Get Client IP

    How to get a user's client IP address in ASP.NET? Often you will want to know the IP address of some ...

  5. legend---十、thinkphp中如何进行原生sql操作

    legend---十.thinkphp中如何进行原生sql操作 一.总结 一句话总结:query方法和execute方法 Db类支持原生SQL查询操作,主要包括下面两个方法: query方法 quer ...

  6. [JZOJ 5910] [NOIP2018模拟10.18] DuLiu 解题报告 (并查集+思维)

    题目链接: https://jzoj.net/senior/#contest/show/2530/0 题目: LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃 ...

  7. _itoa进制转换

    #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> void main() { int ...

  8. winforms控件

     我们在开发窗体应用时,控件是必不可少的今天我们就来认识一下控件 在认识控件之前还要先来认识一下窗体具体如下: 认识窗体和控件 窗体                                   ...

  9. JavaScript学习——表格的隔行换色+高亮显示

    1.案例一:我们希望在后台页面中实现一个隔行换色的效果显示所有的用户信息,显示效果如下: 1)新标签 <thead> //表头 <tr> <th></th&g ...

  10. windows共享如何重新登录,或用另外的用户登录

    使用net use * /del 可以结束已有的所有连接,或net use \\192.168.1.10  /del可以结束指定连接.比如想重新登录共享的话,就用这个命令结束原来的连接,就可以重新登录 ...