1. #include<iostream>
  2. #include<cstdio>
  3. #include<string>
  4. #include<cstring>
  5. #include<algorithm>
  6. using namespace std;
  7. const int maxn = ;
  8. struct edge{
  9. int to;
  10. int nxt;
  11. };
  12. int n,g[maxn],dep[maxn],dpd[maxn],dpv[maxn];
  13. int head[maxn],cnt;
  14. edge e[maxn];
  15. inline void add_edge(int u,int v){
  16. cnt++;
  17. e[cnt].to = v;
  18. e[cnt].nxt = head[u];
  19. head[u] = cnt;
  20. }
  21. void input(){
  22. cin>>n;
  23. int u,v;
  24. for(int i = ;i < n;i++){
  25. scanf("%d%d",&u,&v);
  26. add_edge(u,v);
  27. }
  28. }
  29. void dfs(bool dep,int x){
  30. if(!head[x]){
  31. dpd[x] = dpv[x] = g[x] = ;
  32. return;
  33. }
  34. for(int i = head[x];i;i = e[i].nxt){
  35. dfs(!dep,e[i].to);
  36. g[x] += g[e[i].to];
  37. }
  38. dpv[x] = dpd[x] = ;
  39. if(dep){
  40. int sum = ;
  41. for(int i = head[x];i;i = e[i].nxt){
  42. sum += dpv[e[i].to] - ;
  43. dpd[x] = max(dpd[x],g[x]-g[e[i].to]+dpd[e[i].to]);
  44. }
  45. dpv[x] = max(dpv[x],sum+);
  46. }else{
  47. int sum = ;
  48. for(int i = head[x];i;i = e[i].nxt){
  49. sum += dpd[e[i].to] - ;
  50. dpv[x] = max(dpv[x],g[x]-g[e[i].to]+dpv[e[i].to]);
  51. }
  52. dpd[x] = max(dpd[x],sum+);
  53. }
  54. }
  55. int main(){
  56. freopen("game.in","r",stdin);
  57. freopen("game.out","w",stdout);
  58. input();
  59. dfs(true,);
  60. cout<<dpd[]<<" "<<g[] - dpv[] + ;
  61. return ;
  62. }
  63.  
  64. #include<cstdio>
  65. #include<iostream>
  66. #include<algorithm>
  67. #include<cstring>
  68. #include<cmath>
  69. #include<vector>
  70. #include<queue>
  71. #include<map>
  72. #include<set>
  73. #include<stack>
  74. #include<cstdlib>
  75. #include<string>
  76. #include<bitset>
  77. #define INF 1000000000
  78. #define N 200005
  79. #define fi first
  80. #define se second
  81. #define debug(x) cout<<#x<<"="<<x<<endl
  82. #define MP(x,y) make_pair(x,y)
  83. using namespace std;
  84. typedef long long LL;
  85. typedef pair<int,int> pii;
  86. int dp[N],fa[N],lf[N],m;
  87. vector<int> G[N];
  88. void dfs1(int x,int d)
  89. {
  90. int v,i;
  91. if(d==) dp[x]=INF;
  92. else dp[x]=;
  93. for(i=;i<G[x].size();i++)
  94. {
  95. v=G[x][i];
  96. if(fa[x]!=v)
  97. {
  98. lf[x]=;
  99. fa[v]=x;
  100. dfs1(v,d^);
  101. if(d==)
  102. dp[x]=min(dp[x],dp[v]);
  103. else dp[x]+=dp[v];
  104. }
  105. }
  106. if(!lf[x])
  107. dp[x]=,m++;
  108. }
  109.  
  110. void dfs2(int x,int d)
  111. {
  112. int v,i;
  113. if(d==) dp[x]=;
  114. else dp[x]=INF;
  115. for(i=;i<G[x].size();i++)
  116. {
  117. v=G[x][i];
  118. if(fa[x]!=v)
  119. {
  120. lf[x]=;
  121. fa[v]=x;
  122. dfs2(v,d^);
  123. if(d==)
  124. dp[x]+=dp[v];
  125. else dp[x]=min(dp[x],dp[v]);
  126. }
  127. }
  128. if(!lf[x])
  129. dp[x]=;
  130. //debug(x);
  131. //debug(dp[x]);
  132. }
  133.  
  134. int main()
  135. {
  136. int n,i,a,b;
  137. freopen("game.in","r",stdin);
  138. freopen("game.out","w",stdout);
  139. cin>>n;
  140. for(i=;i<n;i++)
  141. {
  142. scanf("%d%d",&a,&b);
  143. G[a].push_back(b);
  144. //G[b].push_back(a);
  145. }
  146. dfs1(,);
  147. cout<<m-dp[]+<<' ';
  148. dfs2(,);
  149. cout<<dp[]<<endl;
  150. return ;
  151. }
  152. // davidlee1999WTK 2015/
  153. // srO myk Orz
  154. //ios::sync_with_stdio(false);

繁华模拟赛 David与Vincent的博弈游戏的更多相关文章

  1. 繁华模拟赛 David与阶乘

    #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #i ...

  2. David与Vincent的博弈游戏[树型DP]

    \(\mathcal{Description}\) \(\mathcal{Solution}\) 根据题意,我们知道 根节点深度为1,深度为 奇数 的节点由\(David\)移动,我们称为\(D\)点 ...

  3. 繁华模拟赛 Vincent的城堡

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

  4. 繁华模拟赛 Vicent与游戏

    #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #i ...

  5. [繁华模拟赛]Evensgn 剪树枝

    Evensgn 剪树枝 题目 繁华中学有一棵苹果树.苹果树有 n 个节点(也就是苹果),n − 1 条边(也就 是树枝).调皮的 Evensgn 爬到苹果树上.他发现这棵苹果树上的苹果有两种:一 种是 ...

  6. 繁华模拟赛day8 牛栏

    /* 标称并没有用到题解中提到的那种奇妙的性质,我们可以证明,正常从1开始走的话,需要T次,如何使这个次数减小?题解中提到一个办法,有一步小于n/t,我们考虑这一步,如果把它匀到左右两步中,则可以减小 ...

  7. 繁华模拟赛day8 字典序

    /* 这个题要我们求一个字典序,字符串给出的顺序,会对字母的字典序前后相对顺序进行限定,如何用来表示这种限定,我们注意到这种一个之后接着一个,只有先输出他前面的才能输出他,很明显就是拓扑排序,最小方案 ...

  8. 繁华模拟赛day8 科技树

    /* 贪心,很明显是越容易升级的越先升级 */ #include<iostream> #include<cstdio> #include<string> #incl ...

  9. 繁华模拟赛 Vicent坐电梯

    /*n<=5000­这样就不能用O(n)的转移了,而是要用O(1)的转移.­注意我们每次的转移都来自一个连续的区间,而且我们是求和­区间求和?­前缀和!­令sum[step][i]表示f[ste ...

随机推荐

  1. 20145215实验三 敏捷开发与XP实践

    20145215实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软 ...

  2. 随便谈谈用canvas来实现文字图片粒子化

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 看了岑安大大的教程http://www.cnblogs.com/hongru/archive/2012/03/28/2420415.htm ...

  3. [电子书] 《Android编程入门很简单》

    <Android编程入门很简单>是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书.本书避免出现云山雾罩.晦涩难懂的讲解,代之以轻松活泼.由浅入 ...

  4. php 验证格式的函数总结

    在首页上看到了这篇总结性的文章,就收藏了起来,想转载过来留着以后方便查看,但是没有找到转载的地,就只有copy下来了.在这里谢谢群主的分享! // ※CheckMoney($C_Money) 检查数据 ...

  5. 50个提高PHP编程效率的方法

      用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册 ...

  6. java设计优化--装饰者模式

    装饰者模式拥有一个设计非常巧妙的结构,它可以动态的添加功能.在基本的设计原则中,有一条重要的设计准则就是合成/聚合复用原则.根据该原则的思想,代码复用应该尽可能使用委托,而不是使用继承.因为继承是一种 ...

  7. c++ 中 delete p与 delete []p的区别

    #include <cstdio> class A{private: int i;public: ~A() { printf("hi"); }};void d(A *) ...

  8. Java设计模式-享元模式(Flyweight)

    享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查 ...

  9. Servlet,GenericServlet和HttpServlet的继承关系

    HttpServlet是GenericServlet的子类. GenericServlet是个抽象类,必须给出子类才能实例化.它给出了设计servlet的一些骨架,定义了servlet生命周期,还有一 ...

  10. The big deffrence between ($(du * )) and $(du *)

    Infolist=($(du *))echo "Get the list one $Infolist"This has formed a array after quating t ...