【题意】:
给你一张无向图,无向图上每个点代表一个城市,有两个值Va,Vb,分别代表a,b占领该城市所需要消耗的时间,而且a或b去占领它们已经占领的城市的相领城市所需的花费为标准的一般。问最少需要花费多少钱。
【知识点】:
树形DP
【题解】:
dp[u][i][0]:代表以u为根的子树中没有一个点为颜色i绘画开始点所需的最小花费,
即字数中画有i颜色的点的代价都为原来的一般
dp[u][i][1]:代表以u为根的子树中有一个点为颜色i绘画开始点所需的最小花费
u的子树中涂i色的点中有一个点为其本身的代价而不是其一半
【代码】:
1 #include <map> 2 #include <set> 3 #include <cmath> 4 #include <ctime> 5 #include <queue> 6 #include <stack> 7 #include <cstdio> 8 #include <string> 9 #include <vector> 10 #include <cstring> 11 #include <sstream> 12 #include <iostream> 13 #include <algorithm> 14 #include <bitset> 15 #include <climits> 16 using namespace std; 17 18 #define wh while 19 #define inf (int)(~0u/2) 20 #define FOR(i, n) for(int i = 0; i < n; i++) 21 #define FOR1(i, n) for(int i = 1; i < n; i++) 22 #define FOR2(i, n) for(int i = 0; i <= n; i++) 23 #define REP(i,n) for(int i = 1; i <= n; i++) 24 #define FORI(it,n) for(typeof(n.begin()) it = n.begin(); it != n.end(); it++) 25 #define sf scanf 26 #define pf printf 27 #define frs first 28 #define sec second 29 #define psh push_back 30 #define mkp make_pair 31 #define PB(x) push_back(x) 32 #define MP(x, y) make_pair(x, y) 33 #define clr(abc,z) memset(abc,z,sizeof(abc)) 34 #define lt(v) v << 1 35 #define rt(v) v << 1 | 1 36 //#define mid ((l + r) >> 1) 37 #define lson l, mid, v << 1 38 #define rson mid + 1, r, v << 1 | 1 39 40 #define fre freopen("1.txt", "r", stdin) 41 42 typedef long long LL; 43 typedef long double LD; 44 const int INF = 0x3F3F3F3F; 45 const int maxn = 120; 46 vector<int> G[maxn]; 47 int dp[maxn][2][2]; 48 int cost[maxn][2]; int N; 49 50 void dfs(int u, int fa){ 51 if(G[u].size() == 1 && fa != 0){ 52 FOR(i, 2){ 53 dp[u][i][0] = cost[u][i] / 2; 54 dp[u][i][1] = cost[u][i]; 55 } 56 return ; 57 } 58 FOR(i, (int)G[u].size()){ 59 int v = G[u][i]; 60 if(v == fa) continue; 61 dfs(v, u); 62 } 63 FOR(i, 2){ 64 int sum = 0, cha = INF; 65 int cst = cost[u][i]; 66 FOR(j, (int)G[u].size()){ 67 int v = G[u][j]; 68 if(v == fa) continue; 69 int tmp = min(dp[v][i][0], dp[v][i ^ 1][1]); sum += tmp; 70 cha = min(cha, dp[v][i][1] - tmp); 71 //将原先选中的dp[v][i][0]或dp[v][i ^ 1][1]替换成dp[v][i][1]所需要的最小代价 72 } 73 dp[u][i][0] = cst / 2 + sum; 74 dp[u][i][1] = min(cst + sum, cst / 2 + sum + cha); 75 } 76 } 77 78 int main() { 79 wh(sf("%d", &N) != EOF){ 80 REP(i, N) G[i].clear(); 81 REP(i, N) sf("%d", &cost[i][0]); 82 REP(i, N) sf("%d", &cost[i][1]); 83 REP(i, N - 1){ 84 int u, v; sf("%d%d", &u, &v); 85 G[u].PB(v); G[v].PB(u); 86 } 87 dfs(1, 0); 88 pf("%d\n", min(dp[1][0][1], dp[1][1][1])); 89 } 90 }
时间: 2024-12-19 10:01:40