最小权顶点覆盖问题的c++代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最小权顶点覆盖问题是一个经典的图论问题,可以使用动态规划来解决。
以下是使用C++实现的代码示例:
```C++
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
int n, e, head, tail;
int to[MAXN << 1], nxt[MAXN << 1], head[MAXN];
int d[MAXN], q[MAXN];
int f[MAXN][2], w[MAXN];
inline void add_edge(int u, int v) {
to[++e] = v;
nxt[e] = head[u];
head[u] = e;
}
void dp(int u, int fa) {
f[u][0] = 0;
f[u][1] = w[u];
for(int i = head[u]; i; i = nxt[i]) {
int v = to[i];
if(v == fa) continue;
dp(v, u);
f[u][0] += max(f[v][0], f[v][1]);
f[u][1] += f[v][0];
}
}
int main() {
cin >> n;
for(int i = 1; i <= n; i++)
cin >> w[i];
for(int i = 1, u, v; i < n; i++) {
cin >> u >> v;
add_edge(u, v);
add_edge(v, u);
d[u]++;
d[v]++;
}
head = 1, tail = 0;
for(int i = 1; i <= n; i++)
if(d[i] == 1)
q[++tail] = i;
while(head <= tail) {
int u = q[head++];
for(int i = head[u]; i; i = nxt[i]) {
int v = to[i];
if(--d[v] == 1) q[++tail] = v;
}
}
int ans = 0;
for(int i = 1; i <= n; i++) {
if(d[i]) continue;
dp(i, 0);
ans += max(f[i][0], f[i][1]);
}
cout << ans << endl;
return 0;
}
```
这个代码使用了动态规划来求解最小权顶点覆盖问题。
时间复杂度为O(N)。