UVa 10859 - Placing Lampposts 树形DP 难度: 2
题目
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1800
题意
n(n < 1000)个节点m条边的无向无环无重边图,最小顶点覆盖的同时要尽量让只有一个端点是点亮的边数最少
思路
如刘书:
1. 无向无环图一定是森林,适用树形DP
2. 因为有两个优化目标,所以将两个目标线性组合,设以i为根的树上的顶点覆盖数为x,单点点亮边数为y,由于y < 1000,所以可以这样组合,令M>1000,优化目标为xM + y,此处M不妨取2e3
3. 通常情况下树形DP只考虑当前节点i的点亮状态和i节点到子节点的关系,但这样就需要在x最小的同时,选取一部分子节点亮让y最小,由于子节点的数量可能较多,点亮的方法也有多种,这使得统计单点点亮边数变成了比较复杂的事情。刘书则记录i节点的父节点的点亮状态,这样,统计单点点亮边数时,统计的是i到父亲这一条是不是单点点亮,而不是i到儿子这若干条是不是,更为方便。
4. 令a[i]为当i的父亲节点点亮时,以i为根的子树满足题意所需的最小综合代价,b为不点亮时代价。那么,明显,令suma为子节点a之和,sumb为子节点b之和
统计a[i]时,由于父亲节点已经点亮,i可以选择点亮或者不点亮。令singleEdgeSupp为父节点点亮而i不点亮的代价,当i为根时singleEdgeSupp=0,否则为1.a[i] = min(mina + M, minb + singleEdgeSupp),
统计b[i]时,只能点亮i,b[i] = mina + M + 1
假设这颗树真正的根节点为root,那么答案很明显是a[root],因为可以认为根节点有个虚拟父节点,虚拟父节点是点亮的。
感想
1. 错误地认为边<=1就是叶节点,忽略了根节点只有1个或者没有叶结点的情况。
2. 当只有根节点一个点时,按照Debug上所说的,不需要点灯
代码
#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <tuple>
#define LOCAL_DEBUG
using namespace std;
typedef pair<int, int> MyPair;
int n, m;
const int MAXN = 1e3 + ;
const int M = 2e3;
const int INF = 0x7ffffff;
int edges[MAXN][MAXN];
int edgeCnt[MAXN];
int a[MAXN];//father is lighted up
int b[MAXN];//isn't
bool vis[MAXN]; void dfs(int f, int fa) {
vis[f] = true;
if (edgeCnt[f] <= && fa != -) {
a[f] = ;
b[f] = M + ;
}
else {
int singleEdgeSupp = (fa == - ? : );
int suma = ;//light up itself
int sumb = ;//do not light up
for (int i = ; i < edgeCnt[f]; i++) {
int t = edges[f][i];
if (t == fa)continue;
dfs(t, f);
suma += a[t];
sumb += b[t];
}
a[f] = min(suma + M, sumb + singleEdgeSupp);
b[f] = suma + singleEdgeSupp + M;
}
} int main() {
#ifdef LOCAL_DEBUG
freopen("C:\\Users\\Iris\\source\\repos\\ACM\\ACM\\input.txt", "r", stdin);
freopen("C:\\Users\\Iris\\source\\repos\\ACM\\ACM\\output.txt", "w", stdout);
#endif // LOCAL_DEBUG
int T;
scanf("%d", &T);
for (int ti = ; ti <= T && scanf("%d%d", &n, &m) == ; ti++) {
memset(edgeCnt, , sizeof(edgeCnt));
memset(vis, , sizeof(vis));
for (int i = ; i < m; i++) {
int f, t;
scanf("%d%d", &f, &t);
edges[f][edgeCnt[f]++] = t;
edges[t][edgeCnt[t]++] = f;
}
int ansNode = ;
int ansSingleEdge = ;
for (int i = ; i < n; i++) {
if (!vis[i]) {
dfs(i, -);
int sta = a[i];
/*if (sta == 0) {
sta = M;
}*/
ansNode += sta / M;
ansSingleEdge += sta % M;
}
}
printf("%d %d %d\n", ansNode, m - ansSingleEdge, ansSingleEdge); } return ;
}
UVa 10859 - Placing Lampposts 树形DP 难度: 2的更多相关文章
- UVA 10859 - Placing Lampposts 树形DP、取双优值
Placing Lampposts As a part of the mission ‘Beautification of Dhaka City’, ...
- UVA 10859 Placing Lamppost 树形DP+二目标最优解的求解方案
题意:给定一个无向,无环,无多重边,要求找出最少的若干点,使得,每条边之中至少有一个点上有街灯.在满足上述条件的时候将还需要满足让两个点被选择的边的数量尽量多. 题解: 对于如何求解最小的节点数目这点 ...
- UVaLive 10859 Placing Lampposts (树形DP)
题意:给定一个无向无环图,要在一些顶点上放灯使得每条边都能被照亮,问灯的最少数,并且被两盏灯照亮边数尽量多. 析:其实就是一个森林,由于是独立的,所以我们可以单独来看每棵树,dp[i][0] 表示不在 ...
- UVA - 10859 Placing Lampposts 放置街灯
Placing Lampposts 传送门:https://vjudge.net/problem/UVA-10859 题目大意:给你一片森林,要求你在一些节点上放上灯,一个点放灯能照亮与之相连的所有的 ...
- Uva LA 3902 - Network 树形DP 难度: 0
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- uva 10859 - Placing Lampposts dp
题意: 有n个节点,m条边,无向无环图,求最少点覆盖,并且在同样点数下保证被覆盖两次的变最多 分析: 1.统一化目标,本题需要优化目标有两个,一个最小灯数a,一个最大双覆盖边数b,一大一小,应该归一成 ...
- UVa 10859 Placing Lampposts
这种深层递归的题还是要多多体会,只看一遍是不够的 题意:有一个森林,在若干个节点处放一盏灯,灯能照亮与节点邻接的边.要求:符合要求的放置的灯最少为多少,在灯数最少的前提下,一条边同时被两盏灯照亮的边数 ...
- uva10859 Placing Lampposts (树形dp+求两者最小值方法)
题目链接:点击打开链接 题意:给你一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮,每盏灯将照亮以它为一个端点的所有边.在灯的总数最小的前提下,被两盏灯同时照亮的边数应尽量大. ...
- LightOj 1230 Placing Lampposts(树形DP)
题意:给定一个森林.每个节点上安装一个灯可以覆盖与该节点相连的所有边.选择最少的节点数num覆盖所有的边.在num最小的前提下,合理放置num个灯使得被两个灯覆盖的边最多? 思路:F[i][0]代表没 ...
随机推荐
- 《剑指offer》第五十三题(数字在排序数组中出现的次数)
// 面试题53(一):数字在排序数组中出现的次数 // 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1, 2, 3, 3, // 3, 3, 4, 5}和数字3,由于3在这个数组中出 ...
- DAY5 基本数据类型及内置方法
一.可变与不可变数据类型 1.可变类型:值改变,但是id不变,证明就是在改变原值,是可变类型 2.不可变类型:值改变,但是id也跟着变,证明是产生了新的值,是不可变类型 二.数字类型 1.整型int ...
- 类的调用1(被调用的MyFirstJava)
package com.mec.MyFirstJavaLife.text; public class MyFirstJava { /** * @param args */ private in ...
- 数据渲染模板引擎,template-web的使用
一:下载 template-web.js 下载地址:https://aui.github.io/art-template/zh-cn/docs/installation.html 二:引用: 三:ht ...
- RLE Plots: relative log expression
RLE Plots: Visualising Unwanted Variation in High Dimensional Data 参考:RLE Plots: Visualising Unwante ...
- 20165303实验一 Java开发环境的熟悉
实验一简单的java程序编译及运行,文件夹的创建 1.添加文件夹: 命令mkdir+文件夹名称 2.编译,运行Java程序 :javac 主类名.java java 主类名 3.带包(package) ...
- Axios的默认配置(碎片知识)API
axios API axios(config) axios({ method: 'Post', url: '/user/123', data: { //略 } }) axios(url[, confi ...
- 微信小程序分享
点击链接查看详情:(转发的路径的必须写正确) https://mp.weixin.qq.com/debug/wxadoc/dev/api/share.html
- python记录_day018 md5加密
MD5 用法: import hashlib obj = hashlib.md5(加盐) obj.update(明文的bytes) obj.hexdigest() 获取密文 示例: import ha ...
- 『PyTorch』第三弹_自动求导
torch.autograd 包提供Tensor所有操作的自动求导方法. 数据结构介绍 autograd.Variable 这是这个包中最核心的类. 它包装了一个Tensor,并且几乎支持所有的定义在 ...