【题解】洛谷P2607【ZJOI2008】骑士
洛谷P2607:https://www.luogu.org/problemnew/show/P2607
一道毒瘤的环基树问题
第一次做环基树的题目
刚看题目的时候觉得不就是跟没有上司的舞会一样嘛
然后看着样例画了个图发现!!!
居然有环!!受到惊吓的蒟蒻
后来查了一下原来是叫环基树
思路
由于每个骑士有且仅有一个仇恨对象
So 整个图里有且只有一个环而且这个环必过根节点(为什么?)
把每个人的仇人设置为他的 父亲???
所以每个点的出度为1 那么根节点本来应该是0 但是为1 说明根节点在环中
我们只需要找出图中的环
遍历其中的点设为根节点
那么我们只需要在答案中加上取根节点不取其父亲和取父亲不取根节点中最大的
其他的按照:
- 取此点的话 他的儿子都不能来
- 不取此点 他的儿子要来不来都可以 显然取最大
- f[i][0]不取此点 f[i][1]取此点
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 2000000
#define ll long long
using namespace std;
int n,cnt,root;
ll ans;
ll f[maxn][],head[maxn],val[maxn],vis[maxn],fa[maxn];
struct Edge
{
int next;
int to;
}e[maxn];
void add(int u,int v)
{
e[++cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
void dp(int x)
{
vis[x]=;
f[x][]=;
f[x][]=val[x];//初始化
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(v!=root)//如果不是根节点
{
dp(v);
f[x][]+=max(f[v][],f[v][]);//如果不取此点 儿子爱来不来
f[x][]+=f[v][]; //如果取此点 儿子都不能来
}
else
f[x][]=-maxn;//如果是根节点 那么此点不能来设为最小值
}
}
void find(int x)
{
vis[x]=;
root=x;
while(!vis[fa[root]])
{
root=fa[root];
vis[root]=;
}//找环
dp(root);
ll t=max(f[root][],f[root][]);//取最大值
vis[root]=;
root=fa[root];//重新定义根为根节点的其父亲
dp(root);
ans+=max(t,max(f[root][],f[root][]));//取最大值
return;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int x;
scanf("%lld%d",&val[i],&x);
add(x,i);
fa[i]=x;
}
for(int i=;i<=n;i++)
if(!vis[i])
find(i);//找环
printf("%lld",ans);
}
【题解】洛谷P2607【ZJOI2008】骑士的更多相关文章
- 「树形DP」洛谷P2607 [ZJOI2008]骑士
P2607 [ZJOI2008]骑士 题面: 题目描述 Z 国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的 ...
- 洛谷 P2607 [ZJOI2008]骑士 解题报告
P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...
- 洛谷P2607 [ZJOI2008]骑士
P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...
- 洛谷P2607 [ZJOI2008]骑士(树形dp)
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...
- 洛谷 P2607 [ZJOI2008]骑士 树形DP
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...
- 洛谷P2607 [ZJOI2008]骑士(基环树)
传送门 首先这是一个有$n$个点$n$条边的图(据大佬们说这玩意儿叫做基环树?) 不难(完全没有)发现每个连通块里最多只有一个环 那么找到这个环,然后把它断开,再对它的两个端点分别跑树形dp 设$dp ...
- 洛谷P2607 [ZJOI2008]骑士 基环树动归
Code: #include<algorithm> #include<cstdio> #include<algorithm> #include<cstring ...
- 【洛谷P2607】骑士 没有上司的舞会+
题目大意:给定一个 N 个点的外向树森林,点有点权.从该树中选出若干顶点组成一个集合,满足任意相邻的两个顶点不同时出现在该集合中,求这样集合中点权和的最大值为多少. 题解:与树相比,该题多了环这个结构 ...
- P2607 [ZJOI2008]骑士 基环树,树dp;
P2607 [ZJOI2008]骑士 本题本质上就是树dp,和没有上司的舞会差不多,只不过多了一个对基环树的处理. #include<iostream> #include<cstri ...
随机推荐
- pat04-树4. Root of AVL Tree (25)
04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue An A ...
- 代码重构----使用java有限状态机来消除太多的if else判断
1. 状态机基本概念 http://zh.wikipedia.org/wiki/%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA 状态存储关于过去的信息,就是 ...
- 详解ASP.NET MVC Model验证
ASP.NET mvc的最好的优点之一就是支持Model验证,这个特性很方便你可以选择在定义Model的时候在字段中采用特性进行注解约定,也可以在代码中自己进行手动验证.下面就来细说一下ASP.NET ...
- /Date(1410019200000+0800)/如何转换为date对象
<script type="text/javascript">var s = '/Date(1410019200000+0800)/ '; s.replace(/Dat ...
- node.js mysql 使用总结
npm install mysql 使用mysql连接池 let mysql = require('mysql'); let db_config = { "connectionLimit&q ...
- WPF - MVVM 之TreeView
在项目中使用OnPropertyChanged方法,最简单的实例: private event PropertyChangedEventHandler PropertyChanged; protect ...
- 二、MVC3+EF单表增删改查
document 表为例 写入静态类 NorthwindDataProvider: Controller可直接调用:如 //获取document表全部数据 NorthwindDataProvider. ...
- openlayers 聚合效果
//cyd var cydclusterSource = new ol.source.Cluster({ distance: 40, source: new ol.source.Vector({ fe ...
- 微服务学习笔记一:Spring Cloud简介
1.Spring Cloud是一个工具集:Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集:使架构师在创建和发布微服务时极为便捷和有效. Sp ...
- 使用canvas及js简单生成验证码方法
在很多时候都需要用到验证码,前端验证码需要知道Html5中的canvas知识点.验证码生成步骤是:1.生成一张画布canvas 2.生成随机数验证码 3.在画布中生成干扰线 4.把验证码文本填充到 ...