首先,本题的优化目标有两个:放置的街灯a应该尽量少;被两灯同时照亮的边数b应该尽量大。为了统一起见,我们把后者替换为:恰好被一盏灯照亮的边数c应该尽量小,然后改用x = Ma+c作为优化目标,其中一个M为很大的正整数。当x取到最小值时,x/M的整数部分是放置街灯的最小值,x%M为恰好被一盏灯照亮的边数的最小值。

一般来说,如果有两个需要优化的目标v1和v2时,要求首先满足v1最小,在v1最小的情况的下v2最小,则可以将二者组合成一个量Mv1+v2,其中M是一个比“v2的最大理论值和v2的最小理论值之差”还要大的数,这样,只要两个解的v1不同,则v2不管相差多少,都是v11起到决定性的作用;只有当v1相同时,才取决于v2。本题中M取2000.

/********************* Author :fisty* data:2014-12-10* uva 10859* 树形DP* ********************/#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define MAX_N 1010
vector<int> G[MAX_N];
int vis[MAX_N][2], d[MAX_N][2], n, m;int dp(int i, int j, int fa){//j是i的父节点状态(1 为有灯, 0 为无灯)//fa是i的父节点if(vis[i][j]) return d[i][j];vis[i][j] = 1;int& ans = d[i][j];   //ans是对dp进行引用ans = 2000;             //灯的数量加1,x加2000//决策1: i结点放灯,d(i,j) = sum{d(k,1)|k取遍i的所有子节点} + 2000;for(int k = 0;k < G[i].size(); k++){if(G[i][k] != fa){ans += dp(G[i][k], 1, i); //}       }               if(fa >= 0 && !j)   ans++;          //如果i不是根节点还要加上i与父节点的边//决策2:i结点不放灯(只有在i是根节点或者父结点放了灯才可以执行)//d(i,j) = sum{d(k, i)|k取遍所有i的所有子结点}+2000if(j != 0 || fa == -1){//i是根或者i 父节点放了灯int sum = 0;for(int k = 0;k < G[i].size(); k++){if(G[i][k] != fa){sum += dp(G[i][k], 0, i);}}if(fa >= 0) sum++;              //i不是根ans = min(ans , sum);           //在两个决策中选一个最小值}return ans;
}
int main(){int t, a, b;scanf("%d", &t);while(t--){scanf("%d%d", &n, &m);for(int i = 0;i < n; i++) G[i].clear();for(int i = 0;i < m; i++){scanf("%d%d", &a, &b);G[a].push_back(b);G[b].push_back(a);}memset(vis, 0, sizeof(vis));int ans = 0;for(int i = 0;i < n; i++){if(!vis[i][0]){ans += dp(i, 0, -1);    //i是根没有父节点,为-1;}}printf("%d %d %d\n", ans / 2000, m - ans % 2000, ans % 2000);}return 0;
}

uva 10859 放置街灯树形dp相关推荐

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

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

  2. uva 10859 放置街灯--Placing Lampposts

    uva 10859 - Placing Lampposts(树形dp ###两个别人家的代码,没有注释看了很久 ###所以自己改写了一遍,附注释 https://blog.csdn.net/keshu ...

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

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

  4. uva 1218 Perfect Service 树形dp

    // uva 1218 Perfect Service 树形dp // // 解题思路: // // d[u][0]表示节点本身是服务器 // d[u][1]表示节点的父节点是服务器 // d[u][ ...

  5. UVA - 1218 Perfect Service(树形dp)

    题目链接:UVA - 1218 Perfect Service 题意 有n台电脑,互相以无根树的方式连接,现要将其中一部分电脑作为服务器,且要求每台电脑必须连接且只能连接一台服务器(不包括作为服务器的 ...

  6. BZOJ 2314 士兵的放置(play) 树形DP

    题目大意:给定一棵树,求最小支配集以及最小支配集数量 首先我们需要会求最小支配集- - 其实支配集的求法很优雅的= = 那些第一问就写了一大坨的第二问还怎么写- - 可以自己YY一下简单的支配集求法= ...

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

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

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

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

  9. Placing Lampposts ,UVa 10859 树形dp

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

最新文章

  1. 微秒时间_揭秘奇特光速原子研究,记录有史以来最短时间段
  2. 网站在收录后还需要做什么?
  3. 小企业是否能用得上ITIL?
  4. 完全掌握JavaMail
  5. 十大排序算法之堆排序
  6. android git上传出现错误,热更新上传patch包时提示上传失败,文件不合法
  7. [Swust OJ 85]--单向公路(BFS)
  8. vim自己主动缩进配置
  9. mysql 命令行可以连接 php不能,mysql连接命令行可以php竟然不可以
  10. 什么是eSIM技术,eSIM的工作原理以及为什么eSIM会很重要
  11. Angular通过CORS实现跨域方案
  12. Linux后台运行python程序并输出到日志文件
  13. vue使用echarts错误Failed to mount component: template or render function not defined.
  14. 使用PHP,求算100-999以内的水仙花数--详细
  15. 算法第四版练习题答案
  16. 身份证识别技术发展背景及特点
  17. 如何在Android上安装LineageOS
  18. VSCode远程连接服务器报错:Could not establish connection to “xxx”,Faild to write install script to path!【已解决】
  19. 接力队选拔matlab,这是我见过的操作最好的接力队之一= =
  20. 5分钟带你了解Python中的容器型数据类型--列表1

热门文章

  1. 录简写与缩略语 问题解决工具及要点
  2. 网站使用微信登录接口,所踩的坑...
  3. 快来领取哔哩哔哩855张官方壁纸(2021年02月16日更新,附爬虫工具)
  4. Spark Streaming读取Kafka数据的两种方式
  5. 计算机专业进国企有什么难度,大学毕业后才发现,国企与私企的差距不是一星半点,希望你没选错...
  6. java一系列图片加载_RxJava系列文章(一) - 网络图片加载水印一般写法
  7. 抱薪者说 | 卫斯理:出发,从“好玩”开始
  8. 转载 :高中时候想的一个脑洞大开的故事
  9. 【excel】定位列内差异/定位行内容差异单元格
  10. Color Constancy Datasets