uva 10859 - Placing Lampposts(树形dp

###两个别人家的代码,没有注释看了很久
###所以自己改写了一遍,附注释

https://blog.csdn.net/keshuai19940722/article/details/19363649
https://blog.csdn.net/deepquiet/article/details/50609020

//:page70(刘汝佳算法竞赛入门经典--训练指南)
//树形递归#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<memory.h>using namespace std;const int M = 2000;//每开一个灯就加M
const int N = 1010;int n,m;//点数和m行数据
int v[N];
int dp[N][2];//dp[i][j]以i为根节点的状态是j的最小X j=0 or 1(on/off)
vector<int> g[N];//邻接矩阵void init()        //数据初始化
{scanf("%d%d",&n,&m);for(int i = 0;i < n;i++) g[i].clear(); //清空数据,每次重新输入后memset(v,0,sizeof(v));memset(dp,0,sizeof(dp));for(int i = 0;i < m;i++){int a,b;scanf("%d%d",&a,&b);//无向图 初始化邻接表g[a].push_back(b);g[b].push_back(a);}
}void dfs(int x)//深搜遍历整棵树 以x为顶点  0<x<n-1
{//根节点预处理v[x] = 1;  //表明这个点已经遍历过dp[x][0] = 0;//顶点不开灯为0dp[x][1] = M;//开灯为M//子节点for(int i = 0;i < g[x].size();i++)//遍历邻接表{int u =g[x][i];//与X相邻的点if(v[u]) continue; //防止重复遍历dfs(u);//深搜继续遍历下一个dp[x][0] += dp[u][1] + 1;//父节点不放灯的情况,子节点放灯if(dp[u][1] > dp[u][0]) dp[x][1] += dp[u][0]+1;//父节点放灯,并且子节点不放灯else dp[x][1] += dp[u][1];//两个都放灯}
}void solve()
{int ans = 0;for(int i = 0;i < n;i++)//遍历节点{if(!v[i])//如果是没有遍历过的点,因为每次DFS都会把其子点遍历,这些点就没有必要了{dfs(i);ans += min(dp[i][0],dp[i][1]);//选择较小的}}printf("%d %d %d\n",ans/M,m-ans%M,ans%M);
}int main()
{int T; scanf("%d",&T);while(T--){init();solve();}return 0;
}

uva 10859 放置街灯--Placing Lampposts相关推荐

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

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

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

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

  3. uva 10859 放置街灯树形dp

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

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

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

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

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

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

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

  7. UVA - 10859 Placing Lampposts 放置街灯

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

  8. Placing Lampposts ,UVa 10859 树形dp

    UVa 10859 日常刷白书,第三次刷dp刷到这题,竟然还是不会写..... 这个题给定n个点m条边的无向无环图,有至多1000个节点,每个节点有两个状态,可以放灯或者不放灯,要求放最少的灯使得所有 ...

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

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

最新文章

  1. 视觉Transformer快速入门指南!
  2. 编程没基础学python多长时间--零基础学Python,从入门到精通需要多长时间
  3. FFmpeg简易播放器的实现5-音视频同步
  4. Python 一行代码搞定炫酷可视化,你需要了解一下 Cufflinks
  5. VTK:PolyData之CopyAllArrays
  6. android MotionEvent中getX()和getRawX()的区别
  7. [渝粤教育] 潍坊职业学院 化工安全技术 参考 资料
  8. Polyfill工作笔记001---简介
  9. Django中的prefetch_related()函数优化
  10. 61. Rotate List
  11. libaio.so.1: undefined reference to `__stack_chk_fail@GLIBC_2.4'
  12. Julia: readcsv 如何处理带中文字符的CSV文件
  13. 医院信息管理系统有哪些功能?
  14. OpenSTF手机设备管理平台-------二次开发
  15. html5 下一页的代码,jsp实现上一页下一页翻页功能(示例代码)
  16. 围观知乎真福利话题,放松一下。
  17. 如何判断两条直线是否相交
  18. 通过自定义的key进行加密解密
  19. pga是啥oracle,Oracle数据库内存体系 - PGA
  20. Python中可视化工具包Matplotlib和Visdom介绍

热门文章

  1. C++并发编程(C++11到C++17)
  2. 朝闻道(刘慈欣小说)
  3. 利用Python实现图片信息隐藏
  4. 用python做一个简单的猜拳游戏
  5. EVE-ng模拟器安装教程和使用教程
  6. ASP.NET设置404错误页面
  7. STM32 - 使用FSMC控制LCD
  8. windows下批处理文件bat怎么写?
  9. java 图片切割_使用Java实现图像分割
  10. STM32 定时器主从模式,上电立即输出脉冲,输出有尖刺,解决方法