您的位置:首页 > 其它

SRM 571 D2L3:MagicMoleculeEasy,brute force

2014-03-08 15:45 411 查看
题目:http://community.topcoder.com/stat?c=problem_statement&pm=12439&rd=15491

参考:http://apps.topcoder.com/wiki/display/tc/SRM+571

由于k最大为14,且边的数量最大为 50 * 50 / 2,用回溯法剪枝。

代码:

#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <iostream>
#include <sstream>
#include <iomanip>

#include <bitset>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <map>

#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
#include <climits>
using namespace std;

#define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
typedef pair<int, int> pii;
typedef long long llong;
typedef pair<llong, llong> pll;
#define mkp make_pair

/*************** Program Begin **********************/
int sortedPower[55];
vector <int> magicPower;
vector <string> magicBond;
vector <pii> edges;
int k, n;
int res;

bool cmp(int i, int j)
{
return (magicPower[i] > magicPower[j]);
}
class MagicMoleculeEasy {
public:
inline bool isAdded(int x, long long used) { return ( used & (1LL << x) ); }
inline long long add(int x, long long used) { return (used | (1LL << x) ); }
void backtrack(int p, int cnt, long long used)
{
if (p == edges.size()) {
int sum = 0;
for (int i = 0; i < n; i++) {
if (!isAdded( sortedPower[i], used )) {
if (cnt < k) {
++cnt;
sum += magicPower[ sortedPower[i] ];
}
} else {
sum += magicPower[ sortedPower[i] ];
}
}
if (cnt != k) {
sum = -1;
}
res = max(res, sum);
return;
}
int x = edges[p].first, y = edges[p].second;
if (!isAdded(x, used) && !isAdded(y, used)) {
if (cnt + 1 <= k) {
// add x
backtrack(p + 1, cnt + 1, add(x, used));
// add y
backtrack(p + 1, cnt + 1, add(y, used));
}
} else {
// not add
backtrack(p + 1, cnt, used);
}
}
int maxMagicPower(vector <int> _magicPower, vector <string> _magicBond, int _k) {
magicPower = _magicPower;
magicBond = _magicBond;
k = _k;
n = magicPower.size();
for (int i = 0; i < n; i++) {
sortedPower[i] = i;
}
sort(sortedPower, sortedPower + n, cmp);
edges.clear();
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (magicBond[i][j] == 'Y') {
edges.push_back(mkp(i, j));
}
}
}
res = -1;
backtrack(0, 0, 0);
return res;
}

};

/************** Program End ************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: