【Link】:

【Description】

n个节点的树;
每个节点都可以选择3种
1.覆盖和它相连的边; c1花费;
2.覆盖和它相连的边以及和它相连的点相连的边; c2花费;
3.不进行操作
覆盖所有的边的最小花费;

【Solution】

/*n个节点的树;每个节点都可以选择两种1.覆盖和它相连的边; c1花费;2.覆盖和它相连的边以及和它相连的点相连的边; c2花费;覆盖所有的边的花费;g[i][3]表示i节点以下的边都被覆盖的最小花费,i不放,上面一条边有没有被覆盖,0没,1有2表示i可能和它的子树有一个没连上,i不放的最小花费(当然此时i上面没有边);{多定义g[i][2]这个状态,是因为可能i节点放了个2,然后{儿子的儿子}和{儿子}没连;这时在i放一个2也是可以的}f[i][1]...,i放一个1f[i][2]...,i放一个2叶子节点ig[i][0] = 0,g[i][1] = INF,f[i][1] = c1,f[i][2] = c2;非叶子节点ig[i][0]每个子树sonj;{g[sonj][1];f[sonj][1];}g[i][1]每个子树sonj{//肯定要一个f[][2]则其他所有儿子都能连上了tmep1 = min(f[sonj][1],f[sonj][2],g[sonj][1],g[sonj][0]);min{f[sonj][2]-temp1}}g[i][2] -- i可能和它的子树有一个没连上?{{g[sonj][0..1],f[sonj][1],f[sonj][2]}}f[i][1]每个子树sonj{{g[sonj][0..1],f[sonj][1],f[sonj][2]} + c1}f[i][2]每个子树sonj{{g[sonj][0..2],f[sonj][1],f[sonj][2]} + c2;}
*/

【NumberOf WA】

0

【Reviw】

树形DP多想想,感觉不是那么难.

【Code】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define rs(x) scanf("%s",x+1)
#define oi(x) printf("%d",x)
#define ol(x) printf("%lld",x)
#define oc putchar(' ')
#define all(x) x.begin(),x.end()
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0)typedef pair<int,int> pii;
typedef pair<LL,LL> pll;const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1e4;
const int INF = 0x3f3f3f3f;int n,c1,c2,g[N+10][3],f[N+10][3];
vector <int> G[N+10];void dfs(int x,int fa){if (x!=1 && (int) G[x].size()==1){g[x][0] = 0,g[x][1] = INF,f[x][1] = c1,f[x][2] = c2;g[x][2] = INF;return;}int len = G[x].size();g[x][0] = 0;rep1(i,0,len-1){int y = G[x][i];if (y==fa) continue;dfs(y,x);g[x][0] += min(g[y][1],f[y][1]);}g[x][1] = 0;int t = INF;f[x][1] = c1,f[x][2] = c2,g[x][2] = 0;rep1(i,0,len-1){int y = G[x][i],temp1;if (y==fa) continue;temp1 = min(f[y][1],f[y][2]);temp1 = min(temp1,g[y][1]);temp1 = min(temp1,g[y][0]);g[x][1] += temp1;t = min(t,f[y][2]-temp1);f[x][1] += temp1;g[x][2] += temp1;temp1 = min(temp1,g[y][2]);f[x][2] += temp1;}g[x][1] += t;
}int main(){//Open();//Close();while (~ri(n)){ri(c1),ri(c2);if (n==0) break;rep1(i,1,n) G[i].clear();rep1(i,1,n-1){int x,y;ri(x),ri(y);G[x].pb(y),G[y].pb(x);}dfs(1,0);int ans = min(g[1][0],g[1][1]);ans = min(ans,f[1][1]),ans = min(ans,f[1][2]);oi(ans);puts("");}return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7626136.html

【Uva 12093】Protecting Zonk相关推荐

  1. 【UVA 12657】移动盒子 Boxes in a Line

    [UVA 12657]移动盒子 Boxes in a Line 洛谷题目地址 [题意] 一行有n 个盒子,从左到右编号为1-n.模拟以下4种命令. 1 X Y :将盒子X 移动到Y 的左侧(如果X 已 ...

  2. 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵

    偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...

  3. 【UVA 437】The Tower of Babylon(记忆化搜索写法)

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  4. 【Uva - 10047 】The Monocycle(搜索,bfs记录状态)

    题干: Uva的题目就不粘贴题干了,,直接上题意吧. 有你一个独轮车,车轮有5种颜色,为了5中颜色的相对位置是确定的.有两种操作:1.滚动:轮子必须沿着顺时针方向滚动,每滚动一次会到达另一个格子,着地 ...

  5. 【Uva 1625】Color Length

    [Link]: [Description] 给你两个序列,都由大写字母组成; 每次,把两个序列中的一个的开头字母加在字符串的尾端,然后在那个序列中删掉那个开头字母; 最后得到一个字符串; 这个字符串显 ...

  6. 【Uva 10934】Dropping water balloons

    [Link]: [Description] 等价题意: 某人在1..n内选一个数x; 然后让你去猜; 你可以问他是不是在哪个范围里; 每次会告诉你YES或者NO; 问你在最坏的情况下猜出答案需要猜多少 ...

  7. 【Uva 10118】Free Candies

    [Link]: [Description] 有4堆书; 每本书编号从1..20 每堆书都是N本; 然后每次只能从任意一堆的堆顶拿一本书装到自己的口袋里; 你的口袋最多容纳5本书; 当你的口袋里有两本一 ...

  8. 【Uva 1220】Party at Hali-Bula

    [Link]:https://cn.vjudge.net/contest/170078#problem/M [Description] 求一个树的最大独立子集; (即树的一个点集,这个点集中任意两个点 ...

  9. 【Uva 1289】Stacking Plates

    [Link]: [Description] 有n(1≤n≤50)堆盘子,第i堆盘子有hi个盘子(1≤hi≤50),从上到下直径不减.所有盘 子的直径均不超过10000.有如下两种操作. split:把 ...

最新文章

  1. Windows 64位下为wampserver或phpstudy安装Redis扩展
  2. c语言修仙东君嗯哼,C语言修仙
  3. zabbix学习笔记(4)
  4. 写Rap,编菜谱,你画我猜……这些 AI demo 我可以玩一天!
  5. java判断优先级代码_java运算符的优先级
  6. 修改数组(洛谷P7285题题解,C++语言描述)
  7. 数据源管理 | 动态权限校验,表结构和数据迁移流程
  8. c语言计蒜客成绩排序,计蒜客 排序后的数组删除重复数字
  9. js深入研究之神奇的匿名函数类生成方式
  10. ssh链接数设置问题
  11. CustomViewWith_Image_Text_Video
  12. 证明n次根号下n阶乘等价于n/e
  13. MySQL中CASE WHEN的用法
  14. JSP学生综合评价管理系统sqlserver数据库myeclipse开发
  15. wps编号无法继续_wps自动编号取消不了
  16. 软件加密狗破解思路和方法
  17. ADF4351原理图PCB电路设计经验建议
  18. DW标签使用与javascript文档基础介绍
  19. 一文看不懂方差和标准差
  20. 中文界面blend_Blend Modes v3.4 – unity混合模式插件

热门文章

  1. java Arrays Generic
  2. 存储新技术之“连续数据保护(CDP)”
  3. 解决升级 Office 2010 之后 Outlook 提示“无法打开 Microsoft Outlook”
  4. 说说我的ID:fxh7622
  5. 天气预报中的风向到底有啥用?
  6. hive的错误编码+解决方案汇总(持续更新中)
  7. 'django_tables2' is not a registered tag library. Must be one of:
  8. 矩阵行列式的几何意义验证
  9. Error: no such column
  10. 计算机组成要素一:布尔逻辑:门结构