题目描述

Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各界的赞扬。

最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争。战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。

骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出征的。

战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况),并且,使得这支骑士军团最具有战斗力。

为了描述战斗力,我们将骑士按照1至N编号,给每名骑士一个战斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。

输入输出格式

输入格式:

输入文件knight.in第一行包含一个正整数N,描述骑士团的人数。

接下来N行,每行两个正整数,按顺序描述每一名骑士的战斗力和他最痛恨的骑士。

输出格式:

输出文件knight.out应包含一行,包含一个整数,表示你所选出的骑士军团的战斗力。

输入输出样例

输入样例#1: 复制

3

10 2

20 3

30 1

输出样例#1: 复制

30

说明

对于30%的测试数据,满足N ≤ 10;

对于60%的测试数据,满足N ≤ 100;

对于80%的测试数据,满足N ≤ 10 000。

对于100%的测试数据,满足N ≤ 1 000 000,每名骑士的战斗力都是不大于 1 000 000的正整数。


树形动规,因为每个骑士只能恨一个人,所以首先求出联通块,再分别动规,得到的答案相加。

dp[i][0/1] 表示第i个骑士是否选。

转移方程:

dp[x][0]=max(dp[v][1],dp[v][0]) v代表x仇恨的骑士。

dp[x][1]+=dp[v][0]+war[x] war代表战斗力

有一个细节是选出环后从两点一起走一次dfs,最后取max(dp[x1][0],dp[x2][0]),因为dp[x1][0]包括了dp[x2][1]。

#include<bits/stdc++.h>

using namespace std;
const int MAXN = 1000010; int n,cnt=1,head[MAXN],war[MAXN],x1,x2,now;
long long dp[MAXN][2],ans;
bool vis[MAXN]; struct Edge{
int nxt,to;
}edge[MAXN*2]; inline void add(int bg,int ed){
edge[++cnt].to=ed;
edge[cnt].nxt=head[bg];
head[bg]=cnt;
} inline void find(int x,int pre){
vis[x]=1;
for(register int i=head[x];i;i=edge[i].nxt){
if((i^1)==pre) continue;
if(vis[edge[i].to]){
x1=x;x2=edge[i].to;
now=i;
continue;
}
find(edge[i].to,i);
}
} inline void dfs(int x,int pre){
dp[x][0]=0;
dp[x][1]=war[x];
for(register int i=head[x];i;i=edge[i].nxt){
if((i^1)==pre) continue;
if(i==now || (i^1)==now) continue;
dfs(edge[i].to,i);
dp[x][0]+=max(dp[edge[i].to][1],dp[edge[i].to][0]);
dp[x][1]+=dp[edge[i].to][0];
}
} int main(){
scanf("%d",&n);
for(register int i=1;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
add(b,i);add(i,b);
war[i]=a;
}
for(register int i=1;i<=n;i++){
if(!vis[i]){
find(i,-3);
dfs(x1,-3);
long long sum=dp[x1][0];
dfs(x2,-3);
ans+=max(dp[x2][0],sum);
}
}
printf("%d",ans);
return 0;
}

BZOJ 1040 (ZJOI 2008) 骑士的更多相关文章

  1. BZOJ 1040 ZJOI 2008 骑士 基环树林+树形DP

    题目大意:有一些骑士.他们每个人都有一个权值.可是因为一些问题,每个骑士都特别讨厌还有一个骑士.所以不能把他们安排在一起.求这些骑士所组成的编队的最大权值和是多少. 思路:首先貌似是有向图的样子,可是 ...

  2. BZOJ 1040 ZJOI 2008 骑士 树形DP

    题意: 有一些战士,他们有战斗力和讨厌的人,选择一些战士,使他们互不讨厌,且战斗力最大,范围1e6 分析: 把战士看作点,讨厌的关系看作一条边,连出来的是一个基环树森林. 对于一棵基环树,我们找出环, ...

  3. 【BZOJ 1040】 [ZJOI2008]骑士

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

  4. BZOJ 1040:[ZJOI2008]骑士(环套外向树+树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题目大意] 给出环套外向树森林,求最大权独立集. [题解] 我们对于每个连通块 ...

  5. [ZJOI 2008] 骑士

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1040 [算法] 首先 , 题目中互相讨厌的关系构成了一棵基环森林 用拓扑排序找出环 ...

  6. bzoj 1034 [ ZJOI 2008 ] 泡泡堂BNB —— 贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1034 一开始想了个很麻烦的贪心做法,对于每个 a[i],找第一个大于它的 b 匹配…… 然后 ...

  7. [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】

    题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...

  8. [BZOJ 1013][JSOI 2008] 球形空间产生器sphere 题解(高斯消元)

    [BZOJ 1013][JSOI 2008] 球形空间产生器sphere Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面 ...

  9. 从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流)

    从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流) 题面 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运 ...

  10. [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)

    [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...

随机推荐

  1. 使用PHP如何去除字符串结尾的字符

    前言 在工作中遇到一个需求:一串字符串,如"迅雷官方下载"."快播5.0下载",需要去掉他们结尾的"官方下载"和"下载" ...

  2. 从零开始搭建系统1.5——Redis安装及配置

    1.在/usr/目录下创建redis目录 [root@localhost usr]# mkdir redis 2.下载安装包 wget http://download.redis.io/release ...

  3. 【学术篇】规律选手再次证明自己(舒老师的胡策题 T2 LX还在迷路)

    只要你不强制在线, 我就能分块. --Reflash 就算你强制在线, 我还是要分块. --Enzymii 今天做了一波舒老师的毒瘤题, T1据说很水但是没思路所以直接放掉了.. 去看了看T2好像可以 ...

  4. 覆盖element ui 的样式

    我们可以使用 !important  来覆盖element ui 的样式 首先先在浏览器中找到 我们所要修改的样式 ,然后找到她的 class  重新写他的样式 ,例如 . app  { width ...

  5. laravel passport client_credentials

    我是使用 Laravel 5.4 + Dingo Api + passport/jwt 两个验证方式 目前需要用到 passport 的 client_credentials 获取 token成功之后 ...

  6. Dom编程优化

    对Dom的访问代价是昂贵,在富网页应用中通常是性能的瓶颈,所以对Dom的优化十分重要. 一.访问和修改Dom元素 浏览器通常要求JavaScript和Dom实现保持独立的.例如,在Internet E ...

  7. django 模型ManyToMany 关联的添加,删除,查询

    models.py文件内容: from django.db import models class person(models.Model): name = CharField(max_length= ...

  8. Servlet - Servlet相关

    1. 概念 Servlet是指任何实现了Servlet接口的类, Servlet运行于支持Java的应用服务器中, Servlet可以响应任何类型的请求, 但大多数情况下, Servlet只用来扩展基 ...

  9. UDP部分

    IP地址:互联网协议地址,计算机的通行证.计算机在网络中的唯一身份标识.桥接:Ubuntu虚拟机 直接连到局域网NAT:网络地址转换点分十进制:192.168.14.115IP地址通常为4个字节,简称 ...

  10. delphi 获取所有窗口标题

    unit Unit1; interface usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...