题目大意
给定一个有n个节点的无向无环图,在尽量少的节点上放灯,使得所有的被照亮,每盏灯可以照亮以他为一个端点的所有边,在灯的总数最小的前提下,被两盏灯照亮的边应该尽量大;

分析
注意题意,给定的是无向无环图,即“森林”,有多棵树组成,经典的树上的动态规划
此题目要求的优化量有两个,一个是a尽量小,a为灯的总数,另一个是b尽量小,b为被两盏灯照亮的边
为了统一起见我们把b尽量大替换为尽量小,c是被一盏灯照亮的边,我们用x代表两个量
x=Ma+c;
一般来说当优化两个量v1,v2的时候,我们会转化为一个量,而且还需要保存v1与v2的关系,因此我们定义一个量M,M是理论上比|v1-v2|最大值还要大的数;这样的话两个量不需要互相干涉,却又能保存联系…因此对于上面的公式当x取最小值的时候因为M固定所以a,c 必定取最小值。

每棵树互不相干,可以单独优化,最后把答案加起来即可;
对于一棵树,我们定义d(i)表示以i为节点的树最大ans值,决策有两种在i处放灯或是不放灯,那么问题就出现,因为我们是自顶往下递推,在i处放灯或者不妨灯一定会影响子节点的决策。因此我们需要把i的节点的决策也作为状态的一部分纳入状态转移当中;
我们定义d(i,j)表示i的父节点做了j这样的决策(1,表示放灯,0表示不放灯)
决策一: i不放灯,仅当j=0或者自身是跟根节点。此时d(i,j)=sum{d(k,0)|k是i的子节点} 如果i不是根,ans++,表示节点i与其父节点这条边上只有一盏灯照亮;
决策二: i放灯,此时d(i,j)=sum{d(k,1)|k是i的子节点}+M;如果j为0且i不是根节点,ans++,因为i与父节点这条边上只有一盏灯照亮/
代码如下

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<string.h>
#define maxn 1000+20
using namespace std;int d[maxn][2], vis[maxn][2];
int n, m;
vector<int> gr[maxn];
const int M = 2000;int dp(int i, int j, int f)
{if (vis[i][j]) return d[i][j];vis[i][j] = 1;int &ans = d[i][j];ans = M;for (int k = 0; k < gr[i].size(); k++) {if (gr[i][k] != f)ans += dp(gr[i][k], 1, i);}if (!j&&f >= 0) ans++;               //当前节点与父节点只有一个灯照亮;if (j || f < 0) {int sum = 0;for (int k = 0; k < gr[i].size(); k++) {if (gr[i][k] != f) {sum += dp(gr[i][k], 0, i);}}if (f >= 0) sum++;                    //i节点不是根;ans = min(sum, ans);}return ans;
}int main()
{/*int t;cin >> t;while (t--) {cin >> n >> m;int u, v;for (int i = 0; i < n; i++)gr[i].clear();for (int i = 0; i < m; i++) {cin >> u >> v;gr[u].push_back(v);gr[v].push_back(u);}memset(vis, 0, sizeof(vis));*/int ans = 0;for (int i = 0; i < n; i++)if (!vis[i][0])   ans += dp(i, 0, -1);printf("%d %d %d \n", ans / M, m - ans % M, ans%M);}return 0;
}

UVA10859 placin glampposts(放置街灯)相关推荐

  1. UVA10859 放置街灯 Placing Lampposts(树状DP)

    UVA10859 放置街灯 Placing Lampposts(树状DP) 这道题有两种解决方法,因为原图保证无重边无环无自环, 所以原图一定是一颗树(或森林).,都是树状DP,但是实现的过程大同小异 ...

  2. uva10859放置街灯(树形dp)

    例题 30 放置街灯( Placing Lampposts, UVa 10859 ) 给你一个 n 个点 m 条边的无向无环图, 在尽量少的结点上放灯, 使得 所有边都被照亮. 每盏灯将照亮以它为一个 ...

  3. [动态规划] 放置街灯 Uva 10859 - Placing Lampposts

    [动态规划] 放置街灯 Uva 10859 - Placing Lampposts 英文题目: As a part of the mission �Beautification of Dhaka Ci ...

  4. uva 10859 放置街灯树形dp

    首先,本题的优化目标有两个:放置的街灯a应该尽量少:被两灯同时照亮的边数b应该尽量大.为了统一起见,我们把后者替换为:恰好被一盏灯照亮的边数c应该尽量小,然后改用x = Ma+c作为优化目标,其中一个 ...

  5. Placing Lampposts UVA - 10859 放置街灯 树形dp

    As a part of the mission 'Beautification of Dhaka City', the government has decided to replace all t ...

  6. 10_放置街灯(Placing Lampposts,UVa 10859)

    问题来源:刘汝佳<算法竞赛入门经典--训练指南> P70 例题30: 问题描述:有给你一个n个点m条边(m<n<=1000)的无向无环图,在尽量少的节点上放灯,使得所有边都被照 ...

  7. UVA - 10859 Placing Lampposts 放置街灯

    Placing Lampposts 传送门:https://vjudge.net/problem/UVA-10859 题目大意:给你一片森林,要求你在一些节点上放上灯,一个点放灯能照亮与之相连的所有的 ...

  8. 树形DP(放置街灯,uva 10859)

    前面也做了一道很像的题,那道题只要求放置的数目最少,要求覆盖的是点.在这题中,要求覆盖的是边,不但要求放着的数目最少,更要求覆盖两次的边最多.因此贪心法不再适用,最少要多少个点可以贪心求出,但是同时要 ...

  9. UVA 10859 放置街灯(树形DP)

    把无向图转化成有根树. 两个优化的量v1,v2,把二者组合成一个量Mv1+v2,让M是一个比"v2的最大理论值和v2的最小理论值之差"还要大的数, 就可以先决定v1,再决定v2. ...

最新文章

  1. C++ 枚举类型介绍
  2. HDU - 6438(贪心+思维)
  3. spring 定时任务执行两次解决办法
  4. Flink从入门到精通100篇(二十二)-Apache Flink OLAP引擎性能优化及应用
  5. ng build --prod --aot打包Angluar4项目报javaScript heap out of memory,内存溢出
  6. Docker 命令详解(run篇)
  7. @vail 判断某字段在范围内_条件判断函数If,你真的会使用吗?实用技巧都掌握吗?...
  8. mysql的架构及查询sql的执行流程(二)
  9. 2021MathorCup高校数学建模挑战赛——大数据竞赛的一些想法总结
  10. linux内存单个文件大小,linux dd命令参数及用法详解---用指定大小的块拷贝一个文件...
  11. eclipse中文版官方下载
  12. 第八届泰迪杯B题特等奖比赛论文——基于Mask R-CNN及Yolov4的电力巡检中绝缘子缺陷研究
  13. UML用例图怎么画 有手就会
  14. 网页或大屏展示的倒计时器
  15. Openbravo如何新建一个调用
  16. 猜一猜,我国第一次大规模应用二维码是什么时候?
  17. (predicted == labels).sum().item()作用
  18. RC电路耦合、相移、滤波、微分
  19. Redmi K30 Pro 标准版更换相机后魔改为变焦版过程
  20. RFC2833 - 用于DTMF数字信号、电话音和电话信号的RTP负载格式

热门文章

  1. mysql中复杂sql语句之多重if嵌套语句
  2. 实现OCR语言识别Demo(一)- BottomSheet实现
  3. Oceanbase 扩容TPC-H测试
  4. ids for this class must be manually assigned before calling save()报错解决方法
  5. 【elasticsearch】【Kibana】7.6.2版本kibana启动失败master_not_discovered_exception
  6. 计算摄影——图像超分
  7. linux下安装hadoop步骤
  8. font face=微软雅黑 color=DodgerBlue*IncomesESL Analy*/font
  9. 2019 HZNU Winter Training Day 15 Comprehensive Training
  10. 深度学习模型试跑(十三):stylegan3