【算法竞赛入门经典】回溯法与最优性剪枝条 例题7-6 UVa140
2018-03-05 11:05
369 查看
【算法竞赛入门经典】回溯法与最优性剪枝条 例题7-6 UVa140
【算法竞赛入门经典】回溯法与最优性剪枝条 例题7-6 UVa140例题UVa140
分析
储存结构
样例实现代码
结果
例题UVa140
Input
Output
Sample Input
A:FB;B:GC;D:GC;F:AGH;E:HD
#
Sample Output
A B C F G D H E -> 3
分析
一眼能看出来的做法:枚举所有排列的可能性,分别计算带宽之后选取最小的方案。显然枚举全部可能的话时间效率可能不尽人意。那么该如何剪枝呢。当你计算出当前最优解ans之后,若是枚举出一个可能情况后,计算中出现了比ans更大的值,那么肯定不可能比它小了,这种情况应该果断减掉。
如果分别存储每个节点的相邻节点的话,那么如果当前节点的未计算个数大于ans的话,那么无论任何情况下,都不会有比ans更小的解了,也应当减掉。(代码中未写出)
储存结构
从方便的目的来考虑,将字母转化为数字记录。使用一个vector记录每个pair,每个pair中是一个边的两个点编号。即使用其记录了每个边。这样每次只需要遍历所有的边即可。position[]用于记录某个点在当前情况序列中排在第几个。
样例实现代码
#include<iostream> #include<vector> #include<algorithm> #include<cstring> #define maxn 30 using namespace std; vector<pair<int, int> >dat; vector<int>chars; int l[maxn], bestsit[maxn], position[maxn]; int main() { char pin[1000]; while (scanf("%s", pin) == 1 && pin[0] != '#') { int n = 0; int a = 0, b = 0, ans = 10, bandwidth = 0; chars.clear(); for (char c = 'A'; c <= 'Z'; c++) { if (strchr(pin, c)) { chars.push_back(c - 'A'); n++; } } int length = strlen(pin); dat.clear(); while (1) { while (a<length&&pin[a] != ':') a++; if (a == length) break; while (b<length&&pin[b] != ';') b++; for (int i = a + 1; i<b; i++) { dat.push_back(make_pair(pin[a - 1] - 'A', pin[i] - 'A')); } a++; b++; } for (int i = 0; i<n; i++) l[i] = chars[i]; do { bandwidth = 0; for (int i = 0; i<n; i++) position[l[i]] = i; for (int i = 0; i<dat.size(); i++) { bandwidth = max(bandwidth, abs(position[dat[i].first] - position[dat[i].second])); if (bandwidth>ans) break; } if (bandwidth<ans) { memcpy(bestsit, l, sizeof(l)); ans = bandwidth; } } while (next_permutation(l, l + n)); for (int i = 0; i<n; i++) cout << (char)(bestsit[i] + 'A') << " "; cout << "-> " << ans << endl; } return 0; }
结果
相关文章推荐
- 【算法竞赛入门经典】7.7 回溯法求连通块 例题7-14 UVa1602
- 【算法竞赛入门经典】动态规划初步 例题9-7 UVa11584
- 【算法竞赛入门经典】6.5[图的BFS] 例题6-20 UVa1599 (2)
- 【算法竞赛入门经典】多阶段决策问题 例题9-4 UVa116
- 【算法竞赛入门经典】树的最大独立集、树的唯一性问题 例题9-13 UVa1220
- 算法竞赛入门经典 第二版 例题11-4 电话圈 Calling Circles uva247
- 算法竞赛入门经典第五章例题5-7 Ugly Numbers UVA - 136
- 【算法竞赛入门经典】DAG上的动态规划 例题9-2 UVa437
- 【算法竞赛入门经典】树形DP的状态转移方程优化 例题9-14 UVa1218
- 算法竞赛入门经典第五章例题5-5 The SetStack Computer UVA - 12096
- 【算法竞赛入门经典】6.4.2用BFS求最短路 例题6-14 UVa816
- 【算法竞赛入门经典】动态规划初步 例题9-6 UVa11400
- 【算法竞赛入门经典】7.5 路径寻找问题 例题7-9 UVa1601(1)
- 【算法竞赛入门经典】类LCS动态规划;指标函数分解 例题9-7 UVa1625
- 算法竞赛入门经典第六章例题6-3 Matrix Chain Multiplication UVA - 442
- 【算法竞赛入门经典】集合的动态规划;时间优化 例题9-16 UVa1252
- 算法竞赛入门经典第六章例题6-7 Trees on the level UVA - 122
- 【算法竞赛入门经典】递归结构的动态规划 例题9-10 UVa1626
- 算法竞赛入门经典第四章例题4-2 Hangman Judge UVA - 489
- 【算法竞赛入门经典】多阶段决策问题 例题9-5 UVa12563