1040: [ZJOI2008]骑士

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1755  Solved: 690
[Submit][Status]

Description

Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各界的赞扬。最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争。战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出征的。战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况),并且,使得这支骑士军团最具有战斗力。为了描述战斗力,我们将骑士按照1至N编号,给每名骑士一个战斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。

Input

第一行包含一个正整数N,描述骑士团的人数。接下来N行,每行两个正整数,按顺序描述每一名骑士的战斗力和他最痛恨的骑士。

Output

应包含一行,包含一个整数,表示你所选出的骑士军团的战斗力。

Sample Input

3
10 2
20 3
30 1

Sample Output

30

HINT

对于100%的测试数据,满足N ≤ 1 000 000,每名骑士的战斗力都是不大于   1 000 000的正整数。

Source

  ╮(╯▽╰)╭ 網上說什麼外向樹內向樹,完全不懂,說白了,這道題就是一個環套樹DP,由於每個人只貢獻一條邊,所以最終圖的結構只會是一系列包含一個環的聯通快,在這些聯通塊上分別做環套樹DP就行了。

  這道題環套樹DP非常簡單,直接隨機選環上一條邊刪掉,然後特殊處理刪掉邊的兩個端點,使之不被選擇,然後在樹上DP即可。

  這是我第一次編環套樹。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<ctime>
  6. #include<cmath>
  7. #include<algorithm>
  8. #include<set>
  9. #include<map>
  10. #include<vector>
  11. #include<string>
  12. #include<queue>
  13. using namespace std;
  14. #ifdef WIN32
  15. #define LL "%I64d"
  16. #else
  17. #define LL "%lld"
  18. #endif
  19. #define MAXN 1100000
  20. #define MAXV MAXN*2
  21. #define MAXE MAXV*2
  22. #define INF 0x3f3f3f3f
  23. #define INFL 0x00003f3f3f3f3f3fLL
  24. typedef long long qword;
  25. inline int nextInt()
  26. {
  27. char ch;
  28. int x=;
  29. bool flag=false;
  30. do
  31. ch=getchar(),flag=(ch=='-')?true:flag;
  32. while(ch<''||ch>'');
  33. do x=x*+ch-'';
  34. while (ch=getchar(),ch<='' && ch>='');
  35. return x*(flag?-:);
  36. }
  37.  
  38. int n,m;
  39. int e[MAXN][];
  40. struct Edge
  41. {
  42. int np;
  43. Edge *next;
  44. }E[MAXE],*V[MAXV];
  45. int tope=-;
  46. void addedge(int x,int y)
  47. {
  48. E[++tope].np=y;
  49. E[tope].next=V[x];
  50. V[x]=&E[tope];
  51. }
  52. int uf[MAXN];
  53. int get_fa(int now)
  54. {
  55. return (now==uf[now])?now:(uf[now]=get_fa(uf[now]));
  56. }
  57. bool comb(int x,int y)
  58. {
  59. x=get_fa(x);
  60. y=get_fa(y);
  61. if (x==y)return false;
  62. uf[x]=y;
  63. return true;
  64. }
  65. int roof[MAXN],topr=-;
  66. int state[MAXN];
  67. int ptr[MAXN];
  68. int v[MAXN];
  69. pair<qword,qword> dfs(int now,int f)
  70. {
  71. pair<qword,qword> ret,t;
  72. Edge *ne;
  73. ret=make_pair(v[now],);
  74. for (ne=V[now];ne;ne=ne->next)
  75. {
  76. if (ne->np==f)continue;
  77. t=dfs(ne->np,now);
  78. ret.second+=max(t.first,t.second);
  79. ret.first+=t.second;
  80. }
  81. if (state[now])ret.first=-INFL;
  82. return ret;
  83. }
  84. int main()
  85. { int i,j,k;
  86. int x,y,z;
  87. qword ans=;
  88. scanf("%d",&n);
  89. memset(ptr,-,sizeof(ptr));
  90. for (i=;i<=n;i++)uf[i]=i;
  91. for (i=;i<n;i++)
  92. {
  93. scanf("%d%d",&v[i+],&e[i][]);
  94. e[i][]=i+;
  95. if (!comb(e[i][],e[i][]))
  96. {
  97. roof[++topr]=e[i][];
  98. e[i][]=true;
  99. ptr[e[i][]]=e[i][];
  100. }else
  101. {
  102. addedge(e[i][],e[i][]);
  103. addedge(e[i][],e[i][]);
  104. }
  105. }
  106. for (i=;i<=topr;i++)
  107. {
  108. state[get_fa(roof[i])]=true;
  109. }
  110. for (i=;i<=n;i++)
  111. {
  112. if (!state[get_fa(i)])
  113. {
  114. state[get_fa(i)]=true;
  115. roof[++topr]=get_fa(i);
  116. }
  117. }
  118. memset(state,,sizeof(state));
  119. pair<qword,qword> pr;
  120. qword t;
  121. for (i=;i<=topr;i++)
  122. {
  123. if (ptr[roof[i]]==-)
  124. {
  125. pr=dfs(roof[i],roof[i]);
  126. ans+=max(pr.first,pr.second);
  127. }else
  128. {
  129. //state[roof[i]]=true;
  130. state[ptr[roof[i]]]=true;
  131. pr=dfs(roof[i],roof[i]);
  132. t=max(pr.first,pr.second);
  133. state[ptr[roof[i]]]=false;
  134. pr=dfs(roof[i],roof[j]);
  135. t=max(t,pr.second);
  136. ans+=t;
  137. }
  138. }
  139. printf(LL"\n",ans);
  140. return ;
  141. }
 

bzoj 1040: [ZJOI2008]骑士 環套樹DP的更多相关文章

  1. BZOJ 1040: [ZJOI2008]骑士(基环树dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题意: 思路: 这是基环树,因为每个人只会有一个厌恶的人,所以每个节点只会有一个父亲节点,但是 ...

  2. BZOJ 1040 [ZJOI2008]骑士 (基环树+树形DP)

    <题目链接> 题目大意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的 ...

  3. bzoj 1040: [ZJOI2008]骑士 树形dp

    题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3054  Solved: 1162[Submit][S ...

  4. BZOJ 1040: [ZJOI2008]骑士 基环加外向树

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1190  Solved: 465[Submit][Status] ...

  5. [BZOJ 1040][ZJOI2008]骑士

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5403  Solved: 2060[Submit][Status ...

  6. Bzoj 1040 [ZJOI2008]骑士 题解

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5368  Solved: 2044[Submit][Status ...

  7. [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】

    题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...

  8. 【BZOJ】1040: [ZJOI2008]骑士(环套树dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1040 简直不能再神的题orz. 蒟蒻即使蒟蒻,完全不会. 一开始看到数据n<=1000000就 ...

  9. bzoj 1040 [ZJOI2008]骑士(基环外向树,树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题意] 给一个基环森林,每个点有一个权值,求一个点集使得点集中的点无边相连且权 ...

随机推荐

  1. windows 下一个 easy_install 设备

    下载安装python安装工具 1,方法是下载ez_setup.py后 2,在cmd下运行 python ez_setup.py.就可以自己主动安装setuptools 3,环境变量设置将 C:\Pro ...

  2. Myapplication的作用与理解

    1.前沿在设置里面,对应于某一个应用,虽然没有启动,但是上面有一个终止按钮,说明这个应用时启动的,只是里面没有Activity,所以说使用android退出把一个应用退出,实际上他所对应的Applic ...

  3. ctkPlugin插件系统实现项目插件式开发

    插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...

  4. 基于keepalived对redis做高可用配置---转载

    关于keepalived的详细介绍,请移步本人相关博客:http://wangfeng7399.blog.51cto.com/3518031/1405785 功能 ip地址 安装软件 主redis 1 ...

  5. 5 Ways to Use Log Data to Analyze System Performance--reference

    Recently we looked across some of the most common behaviors that our community of 25,000 users looke ...

  6. oracle在敏感操作前创建还原点

    我们都知道,在vmware虚拟机中有一个拍摄快照的功能,我们可以把系统此时的状态保存下来,一方后面遇到不测事件,也好将系统还原,oracle中也有类似功能. 首先创建一张学生表: 向学生表中插入一条数 ...

  7. sqlite 获取数据库中的所有表

    SELECT name from sqlite_master where type='table'

  8. 配置toad进行导入导出数据库操作

    最近需要对oracle进行导入导出操作,于是研究使用toad进行导入导出oracle数据库操作,现稍作记录. oracle的导入导出不管是否使用toad还是pl/sql工具进行操作,实际上最终都是通过 ...

  9. CEO、COO、CFO、CTO

    CEO.COO.CFO.CTO是什么意思? 网站里的各种职位: CEO(Chief executive officer)首席执行官 类似总经理.总裁,是企业的法人代表. COO(Chief opera ...

  10. JQM 页面滚动加载

    1 应用场景:文章比较长,只加载部分,当到页面底部触发获取更多数据. 2 如图,监听滚动条的位置,触发事件,转化为求X的长度, 3 实例代码: //滚动条到底加载更多 $(document).on(& ...