题目链接:https://vjudge.net/problem/UVA-1218

题目大意:给你一棵无向树,让你求树的最小支配集,但是有一个要求是除最小支配集外剩下的任何一个结点不能同时连接支配集中的两个元素

解题报告:采用树形dp,只需将第一种状态的状态转移方程修改为$dp[i][0] = 1+\sum_{ p[u]=i }min(dp[u][0],dp[u][2])$

AC代码:

 1 #include<vector>
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<queue>
 6 #include<stack>
 7 #define numm ch-48
 8 #define pd putchar(' ')
 9 #define pn putchar('\n')
10 #define pb push_back
11 #define fi first
12 #define se second
13 #define fre1 freopen("1.txt","r",stdin)
14 #define fre2 freopen("2.txt","w",stdout)
15 using namespace std;
16 template <typename T>
17 void read(T &res) {
18     bool flag=false;char ch;
19     while(!isdigit(ch=getchar())) (ch=='-')&&(flag=true);
20     for(res=numm;isdigit(ch=getchar());res=(res<<1)+(res<<3)+numm);
21     flag&&(res=-res);
22 }
23 template <typename T>
24 void write(T x) {
25     if(x<0) putchar('-'),x=-x;
26     if(x>9) write(x/10);
27     putchar(x%10+'0');
28 }
29 const int maxn=10010;
30 const int N=1010;
31 const int inf=0x3f3f3f3f;
32 const int INF=0x7fffffff;
33 typedef long long ll;
34 struct node {
35     int v,net;
36 }e[maxn<<1];
37 int cnt,n,head[maxn];
38 int dp[maxn][3];
39 void add(int u,int v) {
40     e[++cnt].v=v;
41     e[cnt].net=head[u];
42     head[u]=cnt;
43 }
44 void DP(int u,int p) {  ///u:当前结点,p:u的父结点
45     bool flag=false;    ///标记是否有一个dp[to][0]<=dp[to][1]
46     int sum=0,inc=INF;
47     dp[u][2]=0; ///第三状态,当前结点未被选中
48     dp[u][0]=1; ///第一状态,当前结点被选中,dp[u][0]+1
49     for(int i=head[u];i!=-1;i=e[i].net) {
50         int to=e[i].v;
51         if(to==p) continue; ///to必须是u的子节点,不是父节点(由根dp到叶子)
52         DP(to,u);   ///dp子节点
53         dp[u][0]+=min(dp[to][0],dp[to][2]);  ///回溯,第一状态的转移
54         if(dp[to][0]<=dp[to][1]) {  ///第二状态的判断
55             flag=true;
56             sum+=dp[to][0];
57         }
58         else {
59             sum+=dp[to][1];
60             inc=min(inc,dp[to][0]-dp[to][1]);
61         }
62         if(dp[to][1]!=INF&&dp[u][2]!=INF)    ///第三状态的转移
63             dp[u][2]+=dp[to][1];
64         else dp[u][2]=INF;  ///根据定义dp[u][2]=(dp[to][1]的总和)
65     }
66     if(!flag&&inc==INF) ///判断当前是不是叶子结点
67         dp[u][1]=INF;
68     else
69         dp[u][1]=sum+(flag?0:inc);
70 }
71 int main()
72 {
73     while(scanf("%d",&n)!=EOF&&n) {
74         for(int i=1;i<=n;i++)
75             head[i]=-1,dp[i][0]=dp[i][1]=dp[i][2]=0,cnt=0;
76         for(int i=1;i<=n-1;i++) {
77             int a,b;
78             read(a),read(b);
79             add(a,b);
80             add(b,a);
81         }
82         DP(1,1);
83         write(min(dp[1][0],dp[1][1]));pn;
84         int flag;
85         read(flag);
86         if(flag==-1) break;
87     }
88     return 0;
89 }

代码在这里!

转载于:https://www.cnblogs.com/wuliking/p/11264374.html

[UVA-1218] Perfect Service(树的最小支配集)相关推荐

  1. uva 1218 Perfect Service 树形dp

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

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

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

  3. 树的最小支配集、最小点覆盖、最大独立集【模板】

    最小支配集:指从所有顶点中取尽量少的点组成一个集合,使得剩下的所有点都与取出来的点有边相连.顶点个数最小的支配集被称为最小支配集.这里用贪心法来求. 1.以1号点深度优先搜索整棵树,求出每个点在DFS ...

  4. 贪心法求树的最小支配集,最小点覆盖,最大独立集

    原文地址(转自 Ashly的博客) 定义: 最小支配集:对于图G = (V, E) 来说,最小支配集指的是从 V 中取尽量少的点组成一个集合, 使得 V 中剩余的点都与取出来的点有边相连.也就是说,设 ...

  5. 树形DP求树的最小支配集,最小点覆盖,最大独立集

    转自:https://www.cnblogs.com/Ash-ly/p/5783877.html 一:最小支配集 考虑最小支配集,每个点有两种状态,即属于支配集合或者不属于支配集合,其中不属于支配集合 ...

  6. uva 1218——Perfect Service

    题意:有n个机器组成的树形结构,要求一台服务器必须连接一台电脑,求使用的最少的服务器.. 思路: 树形DP,和前面的有道题目类似.在dfs遍历树的时候找到选当前结点和不选当前节点的最大状态,多一个两个 ...

  7. [树形DP | Uva 1218]Perfect Service

    dp[i][0]表示以i为根的且i被选为服务器的最小服务器数 dp[i][1]表示以i为根且i不被选为服务器,而i父亲为服务器的最小服务器数 dp[i][2]表示以i为根且i不被选为服务器,而i父亲也 ...

  8. 牛客假日团队赛8:H.Cell Phone Network(最小支配集)

    链接:https://ac.nowcoder.com/acm/contest/1069/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6553 ...

  9. 最小支配集,最小点覆盖,最大独立集(贪心/DP)

    最小支配集(minimal dominating set):对于图G=(V,E)来说,设V'是图G的一个支配集,则对于图中的任意一个顶点u,要么属于集合V',要么与V'中的顶点相连. 在V'中除去任何 ...

最新文章

  1. 自制青蛙跳台阶小游戏~
  2. 手低眼高 初学者学习Hibernate的方法
  3. Sqlite表的结构修改
  4. 思科怎么隐藏端口_这些著名商标下的隐藏设计,你能发现吗?
  5. Android调试技巧之Eclipse行号和Logcat
  6. 美国大学计算机专业排名2014,2014年美国大学计算机科学专业排名
  7. SQL语句取得最大件数(MSSQL ORACLE Postgre,top rownum,limit)
  8. java关键词 英文原文解释,javadoc注释规范(国外英文资料).doc
  9. C/C++ 进阶 —— static
  10. vue中点击,将内容复制到剪贴板
  11. MFC开发环境搭建(顺便来个Helloworld)
  12. 打印机设置手动双面打印方法
  13. Java---设计【员工工资管理系统】
  14. 录播网站 服务器,录播服务器
  15. 新昌中学2021高考成绩查询,新昌中学教育集团向2020年参加高考被第一批录取的553名学子表示热烈祝贺...
  16. Mybatis 入门到理解篇
  17. 迷宫问题----经典回溯法解决
  18. 对话哈佛大学教授Lukin:量子计算将在我们有生之年普及! | AI英雄
  19. 2020.7.6 -- Miller_Rabin和Pollard_Rho算法
  20. MathType7的最新版的介绍

热门文章

  1. 刺客信条起源计算机内存不足,刺客信条起源需要什么配置能玩?最低/推荐配置需求介绍...
  2. php+5.3.15下载,Rapid PHP2018
  3. ISE与Notepad++关联
  4. Linux+Apache+PHP+MySQL服务器环境(CentOS篇)
  5. 100个最佳Linux站点
  6. 【前端 · 面试 】HTTP 总结(六)—— HTTP 版本区别
  7. java面试题 接口和抽象类的区别是什么
  8. LVS配置(DR模式)
  9. PNG in IE - 1 - pngfix.js
  10. http发送16进制报文_图解HTTP 第三章HTTP报文内的HTTP信息