题意:给定一个无向无环图,要在一些顶点上放灯使得每条边都能被照亮,问灯的最少数,并且被两盏灯照亮边数尽量多。

析:其实就是一个森林,由于是独立的,所以我们可以单独来看每棵树,dp[i][0] 表示不在 i 点放灯,dp[i][1] 表示在 i 点放灯,很简单的一个DP

代码如下:

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include <cstdio>
  3. #include <string>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <iostream>
  7. #include <cstring>
  8. #include <set>
  9. #include <queue>
  10. #include <algorithm>
  11. #include <vector>
  12. #include <map>
  13. #include <cctype>
  14. #include <cmath>
  15. #include <stack>
  16. #include <unordered_map>
  17. #include <unordered_set>
  18. #define debug() puts("++++");
  19. #define freopenr freopen("in.txt", "r", stdin)
  20. #define freopenw freopen("out.txt", "w", stdout)
  21. using namespace std;
  22.  
  23. typedef long long LL;
  24. typedef pair<int, int> P;
  25. const int INF = 0x3f3f3f3f;
  26. const double inf = 0x3f3f3f3f3f3f;
  27. const double PI = acos(-1.0);
  28. const double eps = 1e-8;
  29. const int maxn = 1000 + 5;
  30. const int mod = 2000;
  31. const int dr[] = {-1, 1, 0, 0};
  32. const int dc[] = {0, 0, 1, -1};
  33. const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
  34. int n, m;
  35. const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  36. const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  37. inline bool is_in(int r, int c){
  38. return r >= 0 && r < n && c >= 0 && c < m;
  39. }
  40. bool vis[maxn];
  41. int dp[maxn][2];
  42. vector<int> G[maxn];
  43.  
  44. void dfs(int u){
  45. vis[u] = true;
  46. dp[u][0] = 0;
  47. dp[u][1] = mod;
  48. for(int i = 0; i < G[u].size(); ++i){
  49. int v = G[u][i];
  50. if(vis[v]) continue;
  51. dfs(v);
  52. dp[u][0] += dp[v][1] + 1;
  53. dp[u][1] += dp[v][0] < dp[v][1] ? dp[v][0] + 1 : dp[v][1];
  54. }
  55. }
  56.  
  57. int main(){
  58. int T; cin >> T;
  59. while(T--){
  60. scanf("%d %d", &n, &m);
  61. for(int i = 0; i < n; ++i) G[i].clear();
  62. for(int i = 0; i < m; ++i){
  63. int u, v;
  64. scanf("%d %d", &u, &v);
  65. G[u].push_back(v);
  66. G[v].push_back(u);
  67. }
  68.  
  69. memset(vis, false, sizeof vis);
  70. int ans1 = 0, ans2 = 0;
  71. for(int i = 0; i < n; ++i) if(!vis[i]){
  72. dfs(i);
  73. ans1 += min(dp[i][0], dp[i][1]) / mod;
  74. ans2 += min(dp[i][1], dp[i][0]) % mod;
  75. }
  76. int ans3 = m - ans2;
  77. printf("%d %d %d\n", ans1, ans3, ans2);
  78. }
  79. return 0;
  80. }

UVaLive 10859 Placing Lampposts (树形DP)的更多相关文章

  1. UVA 10859 - Placing Lampposts 树形DP、取双优值

                              Placing Lampposts As a part of the mission ‘Beautification of Dhaka City’, ...

  2. UVa 10859 - Placing Lampposts 树形DP 难度: 2

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  3. UVA 10859 Placing Lamppost 树形DP+二目标最优解的求解方案

    题意:给定一个无向,无环,无多重边,要求找出最少的若干点,使得,每条边之中至少有一个点上有街灯.在满足上述条件的时候将还需要满足让两个点被选择的边的数量尽量多. 题解: 对于如何求解最小的节点数目这点 ...

  4. uva10859 Placing Lampposts (树形dp+求两者最小值方法)

    题目链接:点击打开链接 题意:给你一个n个点m条边的无向无环图,在尽量少的节点上放灯,使得所有边都被照亮,每盏灯将照亮以它为一个端点的所有边.在灯的总数最小的前提下,被两盏灯同时照亮的边数应尽量大. ...

  5. LightOj 1230 Placing Lampposts(树形DP)

    题意:给定一个森林.每个节点上安装一个灯可以覆盖与该节点相连的所有边.选择最少的节点数num覆盖所有的边.在num最小的前提下,合理放置num个灯使得被两个灯覆盖的边最多? 思路:F[i][0]代表没 ...

  6. UVA - 10859 Placing Lampposts 放置街灯

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

  7. uva 10859 - Placing Lampposts dp

    题意: 有n个节点,m条边,无向无环图,求最少点覆盖,并且在同样点数下保证被覆盖两次的变最多 分析: 1.统一化目标,本题需要优化目标有两个,一个最小灯数a,一个最大双覆盖边数b,一大一小,应该归一成 ...

  8. LightOJ1230 Placing Lampposts(DP)

    题目大概说给一个森林求其最小点覆盖数,同时在最小点覆盖条件下输出最多有多少条边被覆盖两次. dp[0/1][u]表示以u为根的子树内的边都被覆盖且u不属于/属于覆盖集所需的最少点数 另外,用cnt[0 ...

  9. UVa 10859 Placing Lampposts

    这种深层递归的题还是要多多体会,只看一遍是不够的 题意:有一个森林,在若干个节点处放一盏灯,灯能照亮与节点邻接的边.要求:符合要求的放置的灯最少为多少,在灯数最少的前提下,一条边同时被两盏灯照亮的边数 ...

随机推荐

  1. Json API接口数据生成

    偶然发现,对前端数据模拟挺好用,没有跨域问题 https://myjson.com/

  2. JAVA调用命令行2

    package loadMBQL; import java.io.File; import java.io.FilenameFilter; public class LoadMBQL { /** * ...

  3. Data Matrix Font and Encoder条码控件可以以字体的形式来打印DataMatrix条形码

    Data Matrix Font and Encoder条码控件使您能够以字体的形式来打印DataMatrix条形码. 本产品能够在不论什么支持Java类库..NET动态链接库或Windows COM ...

  4. 模式匹配之sift--- sift图像特征提取与匹配算法代码

    sift,The Scale Invariant Feature Transform ,尺度不变特征变换,是检测图像中具有唯一性.对图像平移.旋转.缩放.甚至仿射变换(如从不同角度拍摄图片)保持不变性 ...

  5. Android自己定义控件--下拉刷新的实现

    我们在使用ListView的时候.非常多情况下须要用到下拉刷新的功能.为了了解下拉刷新的底层实现原理,我採用自己定义ListView控件的方式来实现效果. 实现的基本原理是:自己定义ListView, ...

  6. etymology-I

    1)inter-.intra-.intro- 三个前缀inter-,intra-和intro-还是有差别的. inter-表between,如international那是between differ ...

  7. 【BZOJ2338】[HNOI2011]数矩形 几何

    [BZOJ2338][HNOI2011]数矩形 题解:比较直观的做法就是枚举对角线,两个对角线能构成矩形当且仅当它们的长度和中点相同,然后用到结论:n个点构成的矩形不超过n^2.5个(不会证),所以两 ...

  8. ios怎样在一个UIImageButton的里面加一些自己定义的箭头

    能够採用例如以下方法,写一个函数: -(UIImage*) getOneImageButtonWithArrow{ //tmpView做附控件 UIView *tmpView = [[UIView a ...

  9. 云计算系列——HIVE1.2.1 环境搭建

    hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 其优点是学习成本低,可以通过 ...

  10. PPTP&L2TP&PPPOE client and server configure

    一. PPPOE 1. server(参考http://laibulai.iteye.com/blog/1171898) (1)安装rp-pppoe:yum install rp-pppoe (2)配 ...