洛谷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】骑士的更多相关文章

  1. 「树形DP」洛谷P2607 [ZJOI2008]骑士

    P2607 [ZJOI2008]骑士 题面: 题目描述 Z 国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的 ...

  2. 洛谷 P2607 [ZJOI2008]骑士 解题报告

    P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...

  3. 洛谷P2607 [ZJOI2008]骑士

    P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...

  4. 洛谷P2607 [ZJOI2008]骑士(树形dp)

    题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...

  5. 洛谷 P2607 [ZJOI2008]骑士 树形DP

    题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...

  6. 洛谷P2607 [ZJOI2008]骑士(基环树)

    传送门 首先这是一个有$n$个点$n$条边的图(据大佬们说这玩意儿叫做基环树?) 不难(完全没有)发现每个连通块里最多只有一个环 那么找到这个环,然后把它断开,再对它的两个端点分别跑树形dp 设$dp ...

  7. 洛谷P2607 [ZJOI2008]骑士 基环树动归

    Code: #include<algorithm> #include<cstdio> #include<algorithm> #include<cstring ...

  8. 【洛谷P2607】骑士 没有上司的舞会+

    题目大意:给定一个 N 个点的外向树森林,点有点权.从该树中选出若干顶点组成一个集合,满足任意相邻的两个顶点不同时出现在该集合中,求这样集合中点权和的最大值为多少. 题解:与树相比,该题多了环这个结构 ...

  9. P2607 [ZJOI2008]骑士 基环树,树dp;

    P2607 [ZJOI2008]骑士 本题本质上就是树dp,和没有上司的舞会差不多,只不过多了一个对基环树的处理. #include<iostream> #include<cstri ...

随机推荐

  1. <div>里用display:block有用么?

    对所有的块元素都没有意义,块元素的dispaly属性默认值为block,没必要再显式定义--除非你之前对块元素的display属性重新定义过. =========================== ...

  2. 最新机动车行驶证模板PSD可编辑分层文件下载

    机动车行驶证PSD模板下载地址: http://www.qijieworld.com/thread-1834752-1-1.html 模板为psd格式,内容可编辑修改,需使用 Photoshop CS ...

  3. 【数据库】4.0 MySQL入门学习(四)——linux系统环境下MySQL安装

    1.0 我的操作系统是CentOS Linux release 7.6.1810  (Core) 系统详细信息如下: Linux version 3.10.0-957.1.3.el7.x86_64 ( ...

  4. mac上如何卸载node

    homebrew安装的 直接一条命令 brew uninstall node 官网下载pkg安装包的 一条命令 sudo rm -rf /usr/local/{bin/{node,npm},lib/n ...

  5. 数据结构复习之C语言malloc()动态分配内存概述

    #include <stdio.h> #include <malloc.h> int main(void) { ] = {, , , , }; // 计算数组元素个数 ]); ...

  6. Android 时间范围选择器PickTimeDialog

    个人提供了自己封装的第三方时间选择器,能够自定义时间格式,以及设置时间范围. 基础使用 PickTimeDialog pickDilog= new PickTimeDialog(this).setMa ...

  7. 【起航计划ObjC 002】印第安老斑鸠ObjC的幻想 ---- Ubuntu下安装并使用MAC虚拟机

    本文介绍如何在Ubuntu下安装Mac OS X Mavericks系统.具体如下: 1)安装前准备工作 下载Mac OS X Mavericks系统,地址:http://pan.baidu.com/ ...

  8. PHP 运行环境和服务器相关配置

    1.在DOS命令窗口输入 mysql -hlocalhost -uroot -p回车 进入mysql数据库, 其中-h表示服务器名,localhost表示本地:-u为数据库用户名,root是mysql ...

  9. 数据质量控制软件Q-CHECKER(转)

    随着企业信息化建设的不断深入进行,我们的企业将逐步地发展成为数字化企业.其中作为最基本构成的CATIA数模已经是产品开发制造的唯一依据,CATIA数模的质量就是加工的质量,就是制造的质量,就是生产出的 ...

  10. 收缩事务日志(sqlserver)

    sqlserver数据库的日志文件其实是由很多个逻辑上的日志文件组成,我们可以通过命令看一下数据库日志文件 ​可以看到的是sqlserver数据库日志文件是由很多文件组成的,当数据库日志文件已满的时候 ...