皇宫看守问题(带权树上独立集)


#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#define maxn 2100
using namespace std;
vector<int>G[maxn];
void insert(int be, int en) {
G[be].push_back(en);
}
int dp[maxn][10];
int list[maxn];
void dfs(int x, int fa) {
int d = 0x3f3f3f3f;
for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i];
if (p == fa) continue;
dfs(p, x);
dp[x][0] += min(dp[p][1], dp[p][2]);
dp[x][1] += min(dp[p][1], dp[p][2]);
dp[x][2] += min(dp[p][1], min(dp[p][2], dp[p][0]));
d = min(dp[p][2] - min(dp[p][1], dp[p][2]), d);
}
dp[x][1] += d;
dp[x][2] += list[x];
return;
}
int main() {
int n;
scanf("%d", &n);
int be, k, en;
for (int i = 1; i <= n; i++) {
scanf("%d", &be);
scanf("%d %d", &list[be], &k);
while (k--) {
scanf("%d", &en);
insert(be, en);
insert(en, be);
}
}
dfs(1, -1);
printf("%d\n", min(dp[1][1], dp[1][2]));
return 0;
}
寻找真正的热爱

浙公网安备 33010602011771号