bzoj1040(ZJOI2008)骑士——基环树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1040
基环树的模板。
套路就是把环断开,先把一端作为根节点,强制不选;再把另一端作为根节点,强制不选。
人家的这个判断环的方法真好!还顺便没有连上环的那条边,省下了在函数里判断。
别忘了有多棵基环树!
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e6+;
int n,m,head[N],xnt,fa[N],rta[N],rtb[N];
ll dp[N][],a[N],ans;
struct Edge{
int next,to;
Edge(int n=,int t=):next(n),to(t) {}
}edge[N<<];
int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);}
void add(int a,int b)
{
edge[++xnt]=Edge(head[a],b);head[a]=xnt;
edge[++xnt]=Edge(head[b],a);head[b]=xnt;
fa[find(a)]=find(b);
}
void sol(int cr,int fa)
{
dp[cr][]=a[cr];dp[cr][]=;
for(int i=head[cr],v;i;i=edge[i].next)
{
v=edge[i].to;
if(v==fa)continue;
sol(v,cr);
dp[cr][]+=max(dp[v][],dp[v][]);
dp[cr][]+=dp[v][];
}
}
int main()
{
scanf("%d",&n);int tmp;
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=n;i++)
{
scanf("%lld%d",&a[i],&tmp);
if(find(i)!=find(tmp))
add(i,tmp);
else rta[++m]=i,rtb[m]=tmp;
}
ll c;
for(int i=;i<=m;i++)
{
sol(rta[i],);c=dp[rta[i]][];
sol(rtb[i],);c=max(c,dp[rtb[i]][]);
ans+=c;
}
printf("%lld",ans);
return ;
}
bzoj1040(ZJOI2008)骑士——基环树的更多相关文章
- [BZOJ1040][ZJOI2008]骑士 基环树DP
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题目给出了$n$个点和$n$条无向边,即一棵基环树或者基环树森林. 如果题目给的关系 ...
- BZOJ1040 [ZJOI2008]骑士 基环树林(环套树) 树形动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题意概括 有n个人,每一个人有一个最恨的人. 并且,每一个人有一个权值. 一个人不可以和他最恨的人同时被选中. 现在请你求出在 ...
- [BZOJ1040][ZJOI2008]骑士(环套树dp)
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5816 Solved: 2263[Submit][Status ...
- P2607 [ZJOI2008]骑士 基环树,树dp;
P2607 [ZJOI2008]骑士 本题本质上就是树dp,和没有上司的舞会差不多,只不过多了一个对基环树的处理. #include<iostream> #include<cstri ...
- BZOJ 1040 [ZJOI2008]骑士 (基环树+树形DP)
<题目链接> 题目大意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的 ...
- [ZJOI2008] 骑士 - 基环树dp
一类基环树dp都是这个套路吧 随便拆掉环上的一条边 然后跑树形dp,设\(f[i][0/1]\)表示以第\(i\)个人为根的子树,第\(i\)个人选或不选,能收获的最大值 以断点\(u,v\)为根分别 ...
- luogu2607/bzoj1040 [ZJOI2008]骑士 (基环树形dp)
N个点,每个点发出一条边,那么这个图的形状一定是一个基环树森林(如果有重边就会出现森林) 那我做f[0][x]和f[1][x]分别表示对于x子树,x这个点选还是不选所带来的最大价值 然后就变成了这好几 ...
- 洛谷P2607 [ZJOI2008]骑士 基环树动归
Code: #include<algorithm> #include<cstdio> #include<algorithm> #include<cstring ...
- [bzoj1040][ZJOI2008]骑士_树形dp_基环树_并查集
骑士 bzoj-1040 ZJOI-2008 题目大意:n个骑士,每个骑士有权值val和一个讨厌的骑士.如果一个骑士讨厌另一个骑士那么他们将不会一起出战.问出战的骑士最大atk是多少. 注释:$1\l ...
随机推荐
- 1-23-shell脚本之-if流程控制语句和for循环语句的使用
大纲: 1.逻辑判断 2.if流程控制语句 3.for循环控制语句 ---------------------------------------------- 在开始之前,先了解一下逻辑判断符号 ...
- 共用y轴的双图形绘制
实现这种形式的图形,可通过matplotlib和pandas的实现,相比下pandas实现方便的多. 我数据分析的时候主要是stacked bar.bar和line形式的放在一张图上.stacked ...
- 发送垃圾邮件的僵尸网络——药物(多)、赌博、股票债券等广告+钓鱼邮件、恶意下载链接、勒索软件+推广加密货币、垃圾股票、色情网站(带宏的office文件、pdf等附件)
卡巴斯基实验室<2017年Q2垃圾邮件与网络钓鱼分析报告> 米雪儿 2017-09-07 from:http://www.freebuf.com/articles/network/1465 ...
- nodejs编译sass模块包 node-compass,与gulp包gulp-sass使用方法
简介:node express或者就是node项目中,要自动编译sass方法很多,比如gulp 比如考拉,比如今天我想说的这个包node-compass. 编译sass的三种方法: 前提条件: 都需要 ...
- Linux crontab使用及注意事项
渗透测试中,经常会用到crontab来执行计划任务,从而实现后门程序的隐藏,但crontab有几个坑点还是需要记录一下,方便日后使用时及时查询 1.crontab配置格式 # Example of j ...
- SDKMAN 软件开发工具包管理器
SDKMAN 是用来在类Unix 系统中管理多个版本的开发环境的工具.提供命令行接口来安装.切换.删除.列出候选版本. SDKMAN!是在大多数基于Unix的系统上管理多个软件开发套件的并行版本的工具 ...
- No form of payment has been added yet.
You may select a form of payment after your account balance reaches $10.00. Learn more 显然是说达到10美元以后才 ...
- Java中级面试题——(上)
List和Set比较,各自的子类比较 对比一:Arraylist与LinkedList的比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高 ...
- go语言】Goroutines 并发模式
并发模式 让我们先来回顾一下boring函数的例子. func boring(msg string, c chan string) { for i := 0; ; i++ { c ...
- 【剑指offer】找出数组中任意一个重复的数字,C++实现
原创博文,转载请注明出处! # 题目 # 思路 对于长度为n的数组,范围为0~n-1的数字而言,如果不粗在重复数字,则排序后数组元素和数组角标相同.如果存在重复数字,则在排序的过程中会出现不同下标对应 ...