【Uva 12093】Protecting Zonk
【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放一个1
f[i][2]...,i放一个2
叶子节点i
g[i][0] = 0,g[i][1] = INF,f[i][1] = c1,f[i][2] = c2;
非叶子节点i
g[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;
}
【Uva 12093】Protecting Zonk的更多相关文章
- 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵
偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...
- 【贪心+中位数】【UVa 11300】 分金币
(解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...
- 【UVa 10881】Piotr's Ants
Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...
- 【UVa 116】Unidirectional TSP
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【UVa 1347】Tour
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【UVA 437】The Tower of Babylon(记忆化搜索写法)
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【uva 1025】A Spy in the Metro
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- 【Uva 11584】Partitioning by Palindromes
[Link]:https://cn.vjudge.net/contest/170078#problem/G [Description] 给你若干个只由小写字母组成的字符串; 问你,这个字符串,最少能由 ...
- 【Uva 11400】Lighting System Design
[Link]: [Description] 你要构建一个供电系统; 给你n种灯泡来构建这么一个系统; 每种灯泡有4个参数 1.灯泡的工作电压 2.灯泡的所需的电源的花费(只要买一个电源就能供这种灯泡的 ...
随机推荐
- 【Git 五】TortoiseGit中SSH密钥的配置方法
注意:我用的 TortoiseGit 版本是 2.6 的. 一.找到安装目录下的 bin 目录 二.点击 puttygen.exe 三.点击 Generate 生成完毕之后,将 public key ...
- luogu-1908 逆序对 离散化+树状数组
题目链接:https://www.luogu.org/problem/show?pid=P1908 题意 简单的求逆序对 思路 用树状数组来做逆序对 对于过大的数字来讲,用离散化处理即可 比赛的时候没 ...
- easyui-combobox实现取值范围的联动
需求:需要用两个combobox来输入一个年月的范围,下拉框的内容从服务器获取.需要实现选中前者后,后者的下拉框中不能显示比前者数值小的:选中后者后,前者的下拉框内容不能显示比后者数值大的 有两个co ...
- WPS for Linux使用测评
从去年有WPS for Linux的消息到现在,Linux 版的WPS Office在经过一系列的alpha版本之后终于迎来了Beta版本.笔者也是第一时间下载安装,WPS 文字.WPS 演示和WPS ...
- <Machine Learning in Action >之二 朴素贝叶斯 C#实现文章分类
def trainNB0(trainMatrix,trainCategory): numTrainDocs = len(trainMatrix) numWords = len(trainMatrix[ ...
- iOS App 上架流程
iPhone App 上架流程 1. 申请 App ID (1) 连到 Devel ...
- 前端编程提高之旅(十二)----position置入值应用
这次内推项目用到的遮罩及其页面下方button都涉及一个概念position置入值得概念.效果图例如以下: 一个元素position属性不是默认值static.那么该元素被称为定位元素. 定位的元素生 ...
- javascript小白学习指南1---0
第二章 变量和作用域 在看第二章时我希望,你能够回想一下前一次所讲的内容 假设有所遗忘 点这里 今天我们来说说 变量和作用域的问题 本章主要内容 基本类型和引用类型 运行环境 垃圾回收( ...
- scikit-learn:3.2. Grid Search: Searching for estimator parameters
參考:http://scikit-learn.org/stable/modules/grid_search.html GridSearchCV通过(蛮力)搜索參数空间(參数的全部可能组合).寻找最好的 ...
- 分享:FIFO 同步、异步以及Verilog代码实现
FIFO 很重要,之前参加的各类电子公司的逻辑设计的笔试几乎都会考到. FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线 ...