D题:General Weighted Max Matching
标签:深度优先搜索
题意:给定一个
N
N
N个顶点的加权无向完全图,给定任意两个顶点之间的边权,求满足 “所选边的端点是成对不同” 条件的最大可能总权值。
题解:暴力深搜下去就好了,一个个点遍历下去,如果当前点没有被选,那就选上试试,然后遍历他能走到的其他顶点(没有被标记过的),然后对应打上标记,记得回溯处理一下。过程中更新一下最大的总权值。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll d[20][20], ans = 0, n;
bool vis[20];
void dfs(ll p, ll sum) {
ans = max(ans, sum);
if (p == n + 1) {
return ;
}
dfs(p + 1, sum);
if (!vis[p]) {
for (int j = p + 1; j <= n; j++) {
if (!vis[j]) {
vis[p] = 1; vis[j] = 1;
dfs(p + 1, sum + d[p][j]);
vis[p] = 0; vis[j] = 0;
}
}
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
cin >> d[i][j];
}
}
dfs(1, 0);
cout << ans;
return 0;
}