UVa 140 (枚举排列) Bandwidth

题意较复杂,请参见原题=_=||

没什么好说的,直接枚举每个排列就好了,然后记录最小带宽,以及对应的最佳排列。

STL里的next_permutation函数真是好用。

比较蛋疼的就是题目的输入了。。

还有就是不明白,为什么19、20行注释哪错了??

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 10;
 5
 6 int id[256], letter[maxn];
 7 char in[1000];
 8
 9 int main()
10 {
11     freopen("in.txt", "r", stdin);
12
13     while(scanf("%s", in) == 1 && in[0] != ‘#‘)
14     {
15         int n = 0;
16         for(char ch = ‘A‘; ch <= ‘Z‘; ++ch)
17             if(strchr(in, ch) != NULL)
18             {
19                 //id[ch] = n;
20                 //letter[n++] = ch;
21                 id[ch] = n++;
22                 letter[id[ch]] = ch;
23             }
24
25         int l = strlen(in), p = 0, q = 0;
26         vector<int> u, v;
27         for(;;)
28         {
29             while(p < l && in[p] != ‘:‘) p++;
30             if(p == l) break;
31             while(q < l && in[q] != ‘;‘) q++;
32             for(int i = p+1; i < q; ++i)
33             {
34                 u.push_back(id[in[p-1]]);
35                 v.push_back(id[in[i]]);
36             }
37             p++; q++;
38         }
39
40         int P[maxn], bestP[maxn], pos[maxn], ans = n;
41         for(int i = 0; i < n; ++i) P[i] = i;
42         do
43         {
44             for(int i = 0; i < n; ++i) pos[P[i]] = i;
45             int bandwidth = 0;
46             for(int i = 0; i < u.size(); ++i) bandwidth = max(bandwidth, abs(pos[u[i]] - pos[v[i]]));
47             if(bandwidth < ans)
48             {
49                 ans = bandwidth;
50                 memcpy(bestP, P, sizeof(P));
51             }
52         }while(next_permutation(P, P+n));
53
54         for(int i = 0; i < n; ++i) printf("%c ", letter[bestP[i]]);
55         printf("-> %d\n", ans);
56     }
57
58     return 0;
59 }

代码君

时间: 2024-10-21 14:10:00

UVa 140 (枚举排列) Bandwidth的相关文章

uva 140 Bandwidth (全排列+暴力枚举)

uva 140 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

[2016-02-20][UVA][140][Bandwidth]

UVA - 140 Bandwidth Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description 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 

UVa 140 Bandwidth(DFS 回溯 剪枝)

题意  有一个无向图  对于其所有顶点的一个排列 称一顶点与所有与其有边的其它顶点在排列中下标差的最大值为这个顶点的带宽   而所有顶点带宽的最大值为这个排列的带宽   求这个图带宽最小的排列 枚举排列  ans记录当前找到的最小带宽  枚举过程中一旦出现带宽大于ans的也就不用再扩展了  这样枚举完就得到了答案 #include<cstdio> #include<cstring> using namespace std; const int N = 50; int n, ans,

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

标题:六角填数 如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填写多余的内容. 简单的枚举排列,只要提前将12个结点标号,来判断六个线段总和是否相等. 代码如下: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define MAXN 13 5 int num

poj 1270 Following Orders 枚举排列

题意: 给一个字符集和一些字符之间的小于关系,求字符集上的所有可能排列. 分析: 暴力枚举可以分为枚举子集,枚举排列,枚举组合,这题是个简单的枚举排列,枚举过程中用小于关系剪枝即可. 代码: //poj 1270 //sep9 #include <iostream> #include <algorithm> using namespace std; char vars[64],constraint[256],ans[64]; int g[128][128],vis[256]; in

ACM:回溯法,枚举排列

(一)生成1~n的排列 分析:用递归的思想解决:先输出所有以1开头的排列(这一步是递归调用),然后输出以2开头的排列(又是递归调用),接着是以3开头的排列......最后才是以n开头的排列. 伪代码: void print_permutation(序列A, 集合S) { if(S为空) 输出序列A: else 按照从小到大的顺序依次考虑S的每个元素v { print_permutation(在A的末尾填加v后得到的新序列,S-{v}): } } 下面是实现代码: #include <iostre

poj 2585 Window Pains 暴力枚举排列

题意: 在4*4的格子中有9个窗体,窗体会覆盖它之下的窗体,问是否存在一个窗体放置的顺序使得最后的结果与输入同样. 分析: 在数据规模较小且不须要剪枝的情况下能够暴力(思路清晰代码简单),暴力一般分为枚举子集(for(s=0;s<1<<n;++s))和枚举排列(next_permutation). 代码: //poj 2585 //sep9 #include <iostream> #include <algorithm> using namespace std;

枚举排列 之 “生成1~n的排列”

一.原题 输入n之后,生成1~n的排列. (题目来源:<算法竞赛入门经典>[刘汝佳]) 二.题目源代码 #include <stdio.h> #define MAXN 1000 int a[MAXN][MAXN]; void print_permutation(int n,int*a,int cur) { int i,j; if(cur==n) //递归边界 { for(i=0;i<n;i++) printf("%d",a[i]); printf(&quo

UVa140 Bandwidth (枚举排列)

链接:http://acm.hust.edu.cn/vjudge/problem/19399分析:将结点字母用数字0~n-1表示,id[ch]将字符映射到对应的数字编号,letter将数字编号映射到对应的字符,用两个vector将每个结点的相邻结点编号存下来,然后枚举0~n-1位置上的结点编号,用pos记录每个结点编号所在的位置方便以后查找,然后就是遍历vector,第一个vector代表结点编号i,第二个vector代表结点i的相邻结点编号,找出最远距离,如果当前找到的最远距离已经大于或等于a