UVA140Bandwidth

来源:互联网 发布:ubuntu pyqt5 安装 编辑:程序博客网 时间:2024/05/16 13:59
//UVA140Bandwidth#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<string>#include<algorithm>#include<sstream>#include<vector>#include<cmath>using namespace std;const int MAXN = 30;const int INF = 1e9;int G[MAXN][MAXN];int min_wid = INF;int n = 0;int a[MAXN];bool vis[MAXN];vector<int> ans;int id[300] = {0};void dfs(int cur, int tmp_max, int* a, int cnt) {//cur:当前位置光标;tmp_max:当前暂时的最大带宽if(cur == n) {if(tmp_max >= min_wid) return;//本组合无法找到更小的带宽(回溯)else {min_wid = tmp_max;ans.clear();for(int i = 0; i < n; i++) ans.push_back(a[i]);//储存当前最优解 } }else {for(int i = 0; i < n; i++) {if(vis[i]) continue;a[cur] = i;//从当前未使用的元素里选一个     vis[i] = true;for(int j = 0; j < cur; j++) {    if(G[i][a[j]]) {tmp_max = max(tmp_max, abs(cur - j));}//每次试探下一个新的元素时,更新当前已知最大带宽     }if(tmp_max >= min_wid) {vis[i] = false; return;}//当不可能出现更优解时,剪枝 dfs(cur + 1, tmp_max, a, cnt + 1);vis[i] = false;//用完后撤销访问标记 }}}int main() {string line;while(getline(cin, line)) {    if(line[0] == '#') return 0;min_wid = INF;memset(id, 0, sizeof(id));memset(G, 0, sizeof(G));memset(a, 0, sizeof(a));memset(vis, 0, sizeof(vis));n = 0;char rever[10] = {0};for(int i = 'A'; i <= 'Z'; i++) {//printf("i = %c, n - 1 = %d\n", i, n - 1); if(line.find(i) != string::npos) {id[i] = n++;rever[n - 1] = i;}}for(int i = 0; i < line.size(); i++) if(line[i] == ';') line[i] = ' ';stringstream ss(line);string conne;while(ss >> conne) {for(int i = 2; i < conne.size(); i++) {        int x = id[conne[0]], y = id[conne[i]];G[x][y] = G[y][x] = 1;            }}//记录出现的字母数 dfs(0, 0, a, 0);//暂时默认不会隔着字典序出现字母     for(int i = 0; i < n; i++) printf("%c ", rever[ans[i]]);printf("-> %d\n", min_wid); }return 0;}/*A:FB;B:GC;D:GC;F:AGH;E:HD#*/