题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1040

题意:给出一个图,只有一个环。每个点有一个权值。选出一些点两两不相邻,使得权值最大?

图中只有一个环,那么我们先建树,那么只有一条非树边,非树边上两个点我们设为node和root,那么我们DP两边,先让node不能选,然后让root不能选,DP两次即可,而且,环边不能走。

 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iostream>
 6 #define ll long long
 7 int tot,go[2000005],next[2000005],first[1000005],b[2000005];
 8 int vis[1000005],root,tmp,node,flag,n;
 9 ll f[1000005][2],w[1000005];
10 void insert(int x,int y,int id){
11     tot++;
12     go[tot]=y;
13     next[tot]=first[x];
14     first[x]=tot;
15     b[tot]=id;
16 }
17 void add(int x,int y,int id){
18     insert(x,y,id);
19     insert(y,x,id);
20 }
21 void dfs(int x,int fa){
22     vis[x]=1;
23     for (int i=first[x];i;i=next[i]){
24         int pur=go[i];
25         if (pur==fa) continue;
26         if (vis[pur]){
27             root=pur;
28             node=x;
29             tmp=b[i];
30             continue;
31         }
32         dfs(pur,x);
33     }
34 }
35 void dp(int x,int fa){
36     f[x][0]=0;f[x][1]=0;
37     for (int i=first[x];i;i=next[i]){
38         int pur=go[i];
39         if (b[i]==tmp||pur==fa) continue;
40         dp(pur,x);
41         f[x][0]+=std::max(f[pur][0],f[pur][1]);
42         f[x][1]+=f[pur][0];
43     }
44     f[x][1]+=w[x];
45     if (flag==0&&x==root) f[x][1]=0;
46     if (flag==1&&x==node) f[x][1]=0;
47 }
48 int main(){
49     scanf("%d",&n);
50     int id=0;
51     for (int i=1;i<=n;i++){
52         int x;
53         scanf("%lld%d",&w[i],&x);
54         id++;
55         add(i,x,id);
56     }
57     ll ans=0;
58     ll Ans=0;
59     for (int i=1;i<=n;i++)
60      if (!vis[i]){
61        node=tmp=0;
62        dfs(i,0);
63        flag=1;
64        dp(root,0);
65        Ans=std::max(f[root][0],f[root][1]);
66        flag=0;
67        dp(root,0);
68        Ans=std::max(Ans,std::max(f[root][0],f[root][1]));
69        ans+=Ans;
70     }
71     printf("%lld",ans);
72 }

转载于:https://www.cnblogs.com/qzqzgfy/p/5554127.html

BZOJ 1040 骑士相关推荐

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

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

  2. 基环树DP(bzoj 1040: [ZJOI2008]骑士)

    树:n个点n-1条边的连通图 基环树:n个点n条边的连通图,也就是一个环套着多棵树 基环树DP:找到环上任意相邻两点,断掉这两点之间的边,就形成了一棵树 之后对这两点分别进行一次树形DP即可 例题: ...

  3. bzoj 1040 1040: [ZJOI2008]骑士

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5210  Solved: 1987 [Submit][Stat ...

  4. bzoj 1040: [ZJOI2008]骑士

    第一次做环套树的题 这道题题目中貌似是有向边,实际上想一想就知道是无向的. 因为一个骑士觉得另一个骑士丑他们俩就走不到一起. 所以整个图实际上是一个无向环套树森林. 对于每一棵环套树,先dfs找环,找 ...

  5. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  6. BZOJ 1040 [ZJOI2008]骑士

    内向树dp~ 就是先找环,任取环上有边相连两点,u和v,以u为根,断开u和v之间的边,做两次树形dp,dp[i][0]表示i不选,dp[i][1]表示i选 ①强制u不选,v随意 ②u随意,v不选 两种 ...

  7. BZOJ 1085 骑士精神

    Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3229 Solved: 1908 [Submit][Status][Discuss] Descript ...

  8. BZOJ 1085 骑士精神 迭代加深搜索+A*

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1085 题目大意: 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个 ...

  9. Bzoj 3875 骑士游戏

    DP的本质是DAG上的最短路. 但是如果不是DAG呢?那些常用的最短路算法,比如spfa或者是Dijkstra就可以了. 感觉打开了新世界的大门. 对于这个题来说,我们需要维护一个差分.具体的处理过程 ...

最新文章

  1. C#:消息队列应用程序
  2. .Net2.0 使用ConfigurationManager读写配置文件
  3. Win32 控件篇(3)
  4. mysql中的触发器
  5. vue+element-ui实现分页
  6. CTF Re-Python z3库的使用
  7. jenkins查询mysql_jenkins流水线使用mysql数据库
  8. Android如何优雅地防止Bean类混淆
  9. TK:vtkCameraActor用法实战
  10. 简单介绍强引用,软引用,弱引用,虚引用
  11. javaweb学习总结(二十二):基于Servlet+JSP+JavaBean开发模式的用户登录注册
  12. Silverlight 山寨版样式浏览器
  13. echarts自定义图例legend文字和样式
  14. 前端学习(1648):前端系列实战课程之任务功能清单思路
  15. 【CodeForces - 1066A~E】水题,模拟(有技巧),思维,题意难懂的模拟,二进制问题(有技巧)
  16. 再获绿色等级5A称号!揭开腾讯数据中心节能环保黑科技
  17. redhat 添加ssh端口_Centos以及Redhat修改ssh端口
  18. 在.NET中探测U盘的插入/拔出
  19. 55.Linux/Unix 系统编程手册(下) -- 文件加锁
  20. No.3小白的HTML+CSS心得篇

热门文章

  1. .net中使用反射的简单例子
  2. net core 使用 rabbitmq
  3. WebStorm Git 分支操作
  4. .NET 自定义Json序列化时间格式
  5. [coursera machine learning] Week 1
  6. 关于Nginx的limit_conn模块的思考
  7. SQL点滴5—产生时间demention,主要是时间转换
  8. SRE工程师到底是做什么的?
  9. 常见的数据库端口及查询方法
  10. Linux tree命令