Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各
界的赞扬。最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争。战火绵延五百里,在和平环境
中安逸了数百年的Z国又怎能抵挡的住Y国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一
个真龙天子的降生,带领正义打败邪恶。骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一
些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出
征的。战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有
的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的
情况),并且,使得这支骑士军团最具有战斗力。为了描述战斗力,我们将骑士按照1至N编号,给每名骑士一个战
斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。

Input

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

Output

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

Sample Input3
10 2
20 3
30 1

Sample Output30Hint

N ≤ 1 000 000,每名骑士的战斗力都是不大于 1 000 000的正整数。

题目大意:

分别给你n个骑士的战斗力和他痛恨的骑士(有且仅有一个且不是自己)。要你组织一个军团,使得军团战斗力最强,且军团中没有一个人是另一个人所痛恨的。军团战斗力极为骑士战斗力之和。

看到题目,就想到了之前做到的摘苹果问题(没有上司的聚会)。相邻等级的苹果不能同时被采摘。

DP表达式即为:dp[i][0]=∑max(dp[son][0],dp[son][1]);dp[i][1]=∑dp[son][0];

但是这道题是可能出现环(环上至少有3个元素)的。

如果出现环,则删去环中的一条边,从这条边的两点分别做DP,最后答案便是max(dp[st][0],dp[en][0]),即两点不可能同时取到。

此题可能有多个连通分量,且并非所有连通分量都一定有环(有互相痛恨的骑士)(这导致一条无向边可能存储了两次,要删去一个),这些在代码中都要注意。

答案要lol,链式前向星要开双倍数组!

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm> using namespace std; const int maxn=; int fight[maxn+]; int to[maxn*+];
int nex[maxn*+];
int head[maxn+];
int cnt; void addedge(int u,int v)
{
to[cnt]=v;
nex[cnt]=head[u];
head[u]=cnt++;
} bool isedge(int u,int v)
{
for(int i=head[u];i!=-;i=nex[i])
{
if(to[i]==v)
return true;
}
return false;
} int vis1[maxn+];
int st,en; void dfs1(int x,int fa)
{
vis1[x]=;
for(int i=head[x];i!=-;i=nex[i])
{
if(to[i]!=fa)
{
if(!vis1[to[i]])
dfs1(to[i],x);
else
{
st=x;
en=to[i];
}
}
}
} long long dp[maxn+][];
int vis2[maxn+]; void dfs2(int x)
{
vis2[x]=;
bool flag=false;
for(int i=head[x];i!=-;i=nex[i])
{
if(!vis2[to[i]]&&!((x==st&&to[i]==en)||(x==en&&to[i]==st)))
{
dfs2(to[i]);
flag=true;
dp[x][]+=dp[to[i]][];
dp[x][]+=max(dp[to[i]][],dp[to[i]][]);
}
}
dp[x][]+=1LL*fight[x];
if(!flag)
dp[x][]=1LL*fight[x];
} int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(head,-,sizeof(head));
cnt=;
for(int i=,a,b;i<=n;i++)
{
scanf("%d%d",&a,&b);
fight[i]=a;
if(!isedge(i,b))
{
addedge(i,b);
addedge(b,i);
}
} long long ans=;
memset(vis1,,sizeof(vis1));
for(int i=;i<=n;i++)
{
if(!vis1[i])
{
st=-,en=-;
dfs1(i,-);
//printf("%d %d\n",st,en);
if(st==-&&en==-)
{
memset(vis2,,sizeof(vis2));
memset(dp,,sizeof(dp));
dfs2(i);
ans+=max(dp[i][],dp[i][]);
}
else
{
memset(vis2,,sizeof(vis2));
memset(dp,,sizeof(dp));
dfs2(st);
long long temp=dp[st][];
memset(vis2,,sizeof(vis2));
memset(dp,,sizeof(dp));
dfs2(en);
//printf("%d %d\n",temp,dp[en][0]);
ans+=max(temp,dp[en][]);
}
}
} printf("%lld\n",ans);
}
return ;
}

HYSBZ 1040 骑士 (基环外向树DP)的更多相关文章

  1. [bzoj] 1040 骑士 || 基环外向树dp

    原题 给出n个点n条边和每个点的点权,一条边的两个断点不能同时选择,问最大可以选多少. //图是一张基环外向树森林 是不是很像舞会啊- 就是多了一条边. 所以我们考虑一下对于一棵基环外向树,拆掉一条在 ...

  2. 1040: [ZJOI2008]骑士~基环外向树dp

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

  3. 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士

    基环外向树dp竟然如此简单…… Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发 ...

  4. 【BZOJ1040】[ZJOI2008] 骑士(基环外向树DP)

    点此看题面 大致题意: 给你一片基环外向树森林,如果选定了一个点,就不能选择与其相邻的节点.求选中点的最大权值和. 树形\(DP\) 此题应该是 树形\(DP\) 的一个升级版:基环外向树\(DP\) ...

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

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

  6. BZOJ1040 骑士 基环外向树

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

  7. bzoj 1040 [ZJOI2008]骑士(基环外向树,树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题意] 给一个基环森林,每个点有一个权值,求一个点集使得点集中的点无边相连且权 ...

  8. 洛谷 2921 记忆化搜索 tarjan 基环外向树

    洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...

  9. codeforces 875F(基环外向树)

    题意 有一个左边m个点,右边n个点的二分图(n,m<=1e5),左边每个点向右边恰好连两条权值相同的边. 求这个二分图的最优匹配 分析 对于这种二选一问题,即左边的a连向右边的b和c,权值为d, ...

随机推荐

  1. 神奇的 SQL 之 MySQL 性能分析神器 → EXPLAIN,SQL 起飞的基石!

    前言 开心一刻 某人养了一头猪,烦了想放生,可是猪认识回家的路,放生几次它都自己回来了.一日,这个人想了个狠办法,开车带着猪转了好多路进山区放生,放生后又各种打转,然后掏出电话给家里人打了个电话,问道 ...

  2. &#128293;《手把手》系列基础篇之2-python+ selenium-打开和关闭浏览器(详细)

    1. 简介 本节介绍如何初始化一个webdriver实例对象driver,然后打开和关闭firefox浏览器.要用selenium打开fiefox浏览器.首先需要去下载一个driver插件geckod ...

  3. 2C 还是 2B,跟找工作有什么关系?

    通常,我们会把公司的业务类型分成以下几种: 2C,to Customer,指面向个人客户的业务,即将公司的产品或服务销售给个人,通常做出购买决策的个人也是使用产品或服务的用户.举例说明,像 BAT 发 ...

  4. vue项目中的跨域源请求拦截问题CORS头缺少'Access-Control-Allow-Origin'

    这里使用的是axios发请求出现的. 访问的api接口是: 在不同域之间访问是比较常见,在本地调试访问远程服务器....这就是有域问题. VUE解决通过proxyTable 解决办法: 1.检查请求方 ...

  5. Java每日一面(Part1:计算机网络)[19/11/25]

    作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1. HTTP相关[2] 1.1Get请求和Post请求的区别 从三个层面来回答: 1.1.1 从HTTP报文层面: ​ Get请求将请求信息放在UR ...

  6. Linux root设置初始值的方法

    Linux root设置初始值的方法 ubuntu默认不允许使用root登录,因此初始root账户是不能使用的,需要在普通账户下利用sudo权限修改root密码. 在终端输入sudo passwd r ...

  7. 原生JS scroll()、scrollTo()、scrollBy()

    scroll()  此方法接收两个参数,依次为X坐标和Y坐标:设置滚动条的偏移位置 scrollTo() 此方法和scroll()作用一样,都是设置滚动条的偏移位置. scrollBy() 此法发同样 ...

  8. linux bash shell编程之参数变量和流程控制。

    参数变量:用来向脚本中传递参数 我们在执行脚本的时候可以在其后面加入一些参数,通常来说这些参数与脚本中变量为对应关系. start.sh argu1 argu2 引用方式: $1,,2,……${10} ...

  9. React Native从零开始构建项目(2019)

    环境搭建,参考官网 https://reactnative.cn/ 安装 Xcode Android Studio 目的,实现本地热重载开发,使用vsCode 运行失败,重新执行react-nativ ...

  10. 部署高可用 schduler

    目录 创建 kube-scheduler 证书和私钥 创建和分发 kubeconfig 文件 创建 kube-scheduler 配置文件 创建kube-scheduler启动文件 启动kube-sc ...