BZOJ 1040 骑士
题目链接: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 骑士相关推荐
- bzoj 1040: [ZJOI2008]骑士 树形dp
题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3054 Solved: 1162 [Submit] ...
- 基环树DP(bzoj 1040: [ZJOI2008]骑士)
树:n个点n-1条边的连通图 基环树:n个点n条边的连通图,也就是一个环套着多棵树 基环树DP:找到环上任意相邻两点,断掉这两点之间的边,就形成了一棵树 之后对这两点分别进行一次树形DP即可 例题: ...
- bzoj 1040 1040: [ZJOI2008]骑士
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5210 Solved: 1987 [Submit][Stat ...
- bzoj 1040: [ZJOI2008]骑士
第一次做环套树的题 这道题题目中貌似是有向边,实际上想一想就知道是无向的. 因为一个骑士觉得另一个骑士丑他们俩就走不到一起. 所以整个图实际上是一个无向环套树森林. 对于每一棵环套树,先dfs找环,找 ...
- BZOJ 1040 ZJOI2008 骑士 树形DP
题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...
- BZOJ 1040 [ZJOI2008]骑士
内向树dp~ 就是先找环,任取环上有边相连两点,u和v,以u为根,断开u和v之间的边,做两次树形dp,dp[i][0]表示i不选,dp[i][1]表示i选 ①强制u不选,v随意 ②u随意,v不选 两种 ...
- BZOJ 1085 骑士精神
Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3229 Solved: 1908 [Submit][Status][Discuss] Descript ...
- BZOJ 1085 骑士精神 迭代加深搜索+A*
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1085 题目大意: 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个 ...
- Bzoj 3875 骑士游戏
DP的本质是DAG上的最短路. 但是如果不是DAG呢?那些常用的最短路算法,比如spfa或者是Dijkstra就可以了. 感觉打开了新世界的大门. 对于这个题来说,我们需要维护一个差分.具体的处理过程 ...
最新文章
- C#:消息队列应用程序
- .Net2.0 使用ConfigurationManager读写配置文件
- Win32 控件篇(3)
- mysql中的触发器
- vue+element-ui实现分页
- CTF Re-Python z3库的使用
- jenkins查询mysql_jenkins流水线使用mysql数据库
- Android如何优雅地防止Bean类混淆
- TK:vtkCameraActor用法实战
- 简单介绍强引用,软引用,弱引用,虚引用
- javaweb学习总结(二十二):基于Servlet+JSP+JavaBean开发模式的用户登录注册
- Silverlight 山寨版样式浏览器
- echarts自定义图例legend文字和样式
- 前端学习(1648):前端系列实战课程之任务功能清单思路
- 【CodeForces - 1066A~E】水题,模拟(有技巧),思维,题意难懂的模拟,二进制问题(有技巧)
- 再获绿色等级5A称号!揭开腾讯数据中心节能环保黑科技
- redhat 添加ssh端口_Centos以及Redhat修改ssh端口
- 在.NET中探测U盘的插入/拔出
- 55.Linux/Unix 系统编程手册(下) -- 文件加锁
- No.3小白的HTML+CSS心得篇