题目: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)骑士——基环树的更多相关文章

  1. [BZOJ1040][ZJOI2008]骑士 基环树DP

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题目给出了$n$个点和$n$条无向边,即一棵基环树或者基环树森林. 如果题目给的关系 ...

  2. BZOJ1040 [ZJOI2008]骑士 基环树林(环套树) 树形动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题意概括 有n个人,每一个人有一个最恨的人. 并且,每一个人有一个权值. 一个人不可以和他最恨的人同时被选中. 现在请你求出在 ...

  3. [BZOJ1040][ZJOI2008]骑士(环套树dp)

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5816  Solved: 2263[Submit][Status ...

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

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

  5. BZOJ 1040 [ZJOI2008]骑士 (基环树+树形DP)

    <题目链接> 题目大意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的 ...

  6. [ZJOI2008] 骑士 - 基环树dp

    一类基环树dp都是这个套路吧 随便拆掉环上的一条边 然后跑树形dp,设\(f[i][0/1]\)表示以第\(i\)个人为根的子树,第\(i\)个人选或不选,能收获的最大值 以断点\(u,v\)为根分别 ...

  7. luogu2607/bzoj1040 [ZJOI2008]骑士 (基环树形dp)

    N个点,每个点发出一条边,那么这个图的形状一定是一个基环树森林(如果有重边就会出现森林) 那我做f[0][x]和f[1][x]分别表示对于x子树,x这个点选还是不选所带来的最大价值 然后就变成了这好几 ...

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

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

  9. [bzoj1040][ZJOI2008]骑士_树形dp_基环树_并查集

    骑士 bzoj-1040 ZJOI-2008 题目大意:n个骑士,每个骑士有权值val和一个讨厌的骑士.如果一个骑士讨厌另一个骑士那么他们将不会一起出战.问出战的骑士最大atk是多少. 注释:$1\l ...

随机推荐

  1. Python绘图技巧

    转自:https://www.cnblogs.com/zhizhan/p/5615947.html Python--matplotlib绘图可视化知识点整理 强烈推荐ipython 原文:http:/ ...

  2. Python之匿名函数(filter,map,reduce)

    参考博客:Python匿名函数详解--http://blog.csdn.net/csdnstudent/article/details/40112803 Python内建函数之——filter,map ...

  3. IOS UI-键盘处理和UIToolbar

    // // ViewController.m // IOS_0225-键盘处理和UIToolBar // // Created by ma c on 16/2/25. // Copyright © 2 ...

  4. Ansible 手册系列 一(介绍)

    一 介绍 Ansible 是一个配置管理和应用部署工具,功能类似于目前业界的配置管理工具 Chef,Puppet,Saltstack.Ansible 是通过 Python 语言开发.Ansible 平 ...

  5. Netty实例几则

    Netty是基于JDK NIO的网络框架 简化了NIO编程, 不用程序自己维护selector, 将网络通信和数据处理的部分做了分离 多用于做底层的数据通信, 心跳检测(keepalived) 1. ...

  6. 初次学习AngularJS

    一.指令1.AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-. ng-app 指令初始化一个 AngularJS 应用程序. ng-app 指令定义了 AngularJS 应用程序的 ...

  7. scala学习之实现RPC通信

    最近学习scala,个人感觉非常灵活,实现rpc通信非常简单,函数式编程比较烧脑 1.搭建工程 创建scala maven 工程 项目pom文件 <project xmlns="htt ...

  8. LeetCode OJ:Letter Combinations of a Phone Number(数字字母组合)

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  9. 分布式锁-基于ZK和Redis实现

    一.基于zookeeper实现分布式锁 1.1 Zookeeper的常用接口 package register; import java.util.List; import java.util.con ...

  10. c# DataTable行转列

    /// <summary> /// datatable行转列 /// </summary> /// <param name="dtSrc">来源 ...