***状态设计值得一看
dp[u][0]表示u是服务器(以下v均指任意u的子结点,son指u的所有子结点)
ap[u][0]=sum{dp[v][1]}+1//错误,服务器是可以和其他服务器相邻的
dp[u][0]=sum{min(dp[v][0],dp[v][1])}+1
dp[u][1]表示u不是服务器,但是父亲是,显然子结点不是
dp[u][1]=sum{dp[v][2]}
dp[u][2]表示u和父亲都不是服务器,但自身有一个子结点是
此情况-1表示不可能满足
***dp[u][2]=min{dp[v][0]}//错误,别犯傻,怎么能忽略其他子结点需要的服务器
dp[u][2]=min{dp[v][0]+sum{dp[x][2]}}(x∈son-i)
=sum{dp[v][2]}-max{dp[v][2]-dp[v][0]}
=dp[u][1]+min{dp[v][0]-dp[v][2]}
(以上"表示..."均指"表示...的情况总数")

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. int dp[][];
  6. bool vis[];
  7. //int vis2[20010];
  8. struct Edge
  9. {
  10. int to,next;
  11. }edge[];
  12. int num_edge,n,first[];
  13. //void dfs(int x)
  14. //{
  15. // int k=first[x];
  16. // while(k!=0)
  17. // {
  18. // if(vis2[k]==0)
  19. // {
  20. // vis2[k]=1;
  21. // vis2[edge[k].p]=-1;
  22. // dfs(edge[k].to);
  23. // }
  24. // k=edge[k].next;
  25. // }
  26. //}
  27. void dfs2(int u)
  28. {
  29. vis[u]=true;
  30. dp[u][]=;
  31. dp[u][]=;
  32. int k=first[u],v;
  33. while(k!=)
  34. {
  35. v=edge[k].to;
  36. if(!vis[v])
  37. {
  38. dfs2(v);
  39. dp[u][]+=min(dp[v][],dp[v][]);
  40. dp[u][]+=dp[v][];
  41. dp[u][]=min(dp[u][],dp[v][]-dp[v][]);
  42. }
  43. k=edge[k].next;
  44. }
  45. dp[u][]+=dp[u][];
  46. }
  47. //void print(int x)
  48. //{
  49. // printf("%d ",x);
  50. // int k=first[x];
  51. // while(k!=0)
  52. // {
  53. // if(vis2[k]==1)
  54. // {
  55. // print(edge[k].to);
  56. // }
  57. // k=edge[k].next;
  58. // }
  59. //}
  60. int main()
  61. {
  62. int t,i,a,b;
  63. while(n!=-)
  64. {
  65. scanf("%d",&n);
  66. num_edge=;
  67. memset(vis,,sizeof(vis));
  68. memset(first,,sizeof(first));
  69. memset(dp,0x01,sizeof(dp));
  70. for(i=;i<n;i++)
  71. {
  72. scanf("%d%d",&a,&b);
  73. edge[++num_edge].to=b;
  74. edge[num_edge].next=first[a];
  75. first[a]=num_edge;
  76. //edge[num_edge].p=num_edge+1;
  77. edge[++num_edge].to=a;
  78. edge[num_edge].next=first[b];
  79. first[b]=num_edge;
  80. //edge[num_edge].p=num_edge-1;
  81. }
  82. //dfs(1);
  83. //print(1);
  84. dfs2();
  85. // t=min(dp[1][0],dp[1][1]);
  86. // if(dp[1][2]!=-1)//不需要给dp[][2]加负一的特判,只需要保持在不可能时把值设为非常大的值(Maxn)即可
  87. // t=min(t,dp[1][2]);//错的,根结点不能为自己和父亲都是服务器,因为没有父亲
  88. printf("%d\n",min(dp[][],dp[][]));
  89. scanf("%d",&n);
  90. }
  91. return ;
  92. }

UVa 1218 Perfect Service 完美的服务的更多相关文章

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

    题目链接:id=36043">UVA - 1218 Perfect Service 题意 有n台电脑.互相以无根树的方式连接,现要将当中一部分电脑作为server,且要求每台电脑必须连 ...

  2. UVa 1218 - Perfect Service

    /*---UVa 1218 - Perfect Service ---首先对状态进行划分: ---dp[u][0]:u是服务器,则u的子节点可以是也可以不是服务器 ---dp[u][1]:u不是服务器 ...

  3. UVa 1218 - Perfect Service(树形DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVA - 1218 Perfect Service (树形DP)

    思路:dp[i][0]表示i是服务器:dp[i][1]表示i不是服务器,但它的父节点是服务器:dp[i][2]表示i和他的父亲都不是服务器.       转移方程: d[u][0] += min(d[ ...

  5. UVA - 1218 Perfect Service (树形dp)(inf相加溢出)

    题目链接 题意:给你一个树形图,让你把其中若干个结点染成黑色,其余的染成白色,使得任意一个白色结点都恰好与一个黑色结点相邻. 解法比较容易,和树上的最大独立集类似,取一个结点作为树根,对每个结点分三种 ...

  6. Perfect Service [POJ 3398]

    Perfect Service 描述 网络由N个通过N-1个通信链路连接的计算机组成,使得任何两台计算机可以通过独特的路由进行通信.如果两台计算机之间存在通信链路,则称这两台计算机是相邻的.计算机的邻 ...

  7. Web Service实现分布式服务的基本原理

    简单的说, 就是客户端根据WSDL 生成 SOAP 的请求消息, 通过 HTTP 传输方式(也可以是其它传输方式, 如 FTP 或STMP 等,目前 HTTP 传输方式已经成为 J2EE Web Se ...

  8. Android(java)学习笔记227:服务(service)之服务的生命周期 与 两种启动服务的区别

    1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...

  9. angularjs factory,service,provider 自定义服务的不同

    angularjs框架学了有一段时间了,感觉很好用.可以把angularjs的app理解成php的class,controller是控制器,而内置服务和自定义服务就可以理解成models了.angul ...

随机推荐

  1. Linux主要命令

    pwd  查看当前路径 cd ..    表示后一级目录级 cd .   表示当前目录 cd ../..   后退两级 cd  表示进入当前家目录 date 返回当前的一个具体时间    -s  修改 ...

  2. Chrome浏览器 js 关闭窗口失效解决方法

    //获取元素ID var DelHtml = document.getElementById("imgdel"); //alert(DelHtml); //添加点击事件 DelHt ...

  3. Finally语句块的运行

    一.finally语句块是否一定运行? Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被运行?非常多人都说不是.当然他们的回答是正确的,经过试验. ...

  4. Android — 长按ListView 利用上下文菜单(ActionMode) 进行批量事件处理

    好久没写博客拉``````` 近期最终略微闲一点了``````` 无聊拿手机清理短信.发现批量事件的处理还是挺管用的`````` 那么自己也来山寨一记看看效果吧````` 闲话少说,首先,我们来看下手 ...

  5. HBase协处理器同步二级索引到Solr

    一. 背景二. 什么是HBase的协处理器三. HBase协处理器同步数据到Solr四. 添加协处理器五. 测试六. 协处理器动态加载 一. 背景 在实际生产中,HBase往往不能满足多维度分析,我们 ...

  6. mysql 免安装配置问题

    摘要: MySQL是一个小型关系型数据库管理系统,MySQL被广泛地应用在Internet上的中小型网站中.由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体 ...

  7. nodejs 实战

    使用 Koa + MongoDB + Redis 搭建论坛系统 「新手向」koa2从起步到填坑 基于koa2和react的PC端脚手架 一键生成koa/koa2项目: nodejs原生,express ...

  8. POJ3268 Silver Cow Party —— 最短路

    题目链接:http://poj.org/problem?id=3268 Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total ...

  9. POJ3074 Sudoku —— Dancing Links 精确覆盖

    题目链接:http://poj.org/problem?id=3074 Sudoku Time Limit: 1000MS   Memory Limit: 65536K Total Submissio ...

  10. flywaydb and sql server

    https://flywaydb.org/documentation/database/sqlserver How Flyway works https://flywaydb.org/getstart ...