HYSBZ 1040 骑士 (基环外向树DP)
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)的更多相关文章
- [bzoj] 1040 骑士 || 基环外向树dp
原题 给出n个点n条边和每个点的点权,一条边的两个断点不能同时选择,问最大可以选多少. //图是一张基环外向树森林 是不是很像舞会啊- 就是多了一条边. 所以我们考虑一下对于一棵基环外向树,拆掉一条在 ...
- 1040: [ZJOI2008]骑士~基环外向树dp
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...
- 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士
基环外向树dp竟然如此简单…… Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发 ...
- 【BZOJ1040】[ZJOI2008] 骑士(基环外向树DP)
点此看题面 大致题意: 给你一片基环外向树森林,如果选定了一个点,就不能选择与其相邻的节点.求选中点的最大权值和. 树形\(DP\) 此题应该是 树形\(DP\) 的一个升级版:基环外向树\(DP\) ...
- [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】
题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...
- BZOJ1040 骑士 基环外向树
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6421 Solved: 2544[Submit][Status ...
- bzoj 1040 [ZJOI2008]骑士(基环外向树,树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题意] 给一个基环森林,每个点有一个权值,求一个点集使得点集中的点无边相连且权 ...
- 洛谷 2921 记忆化搜索 tarjan 基环外向树
洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...
- codeforces 875F(基环外向树)
题意 有一个左边m个点,右边n个点的二分图(n,m<=1e5),左边每个点向右边恰好连两条权值相同的边. 求这个二分图的最优匹配 分析 对于这种二选一问题,即左边的a连向右边的b和c,权值为d, ...
随机推荐
- python3基础之 字符串切片
一.python3中,可迭代对象有:列表.元组.字典.字符串:常结合for循环使用:均可使用索引切片 实例: str = ' #str[start:stop:step] 遵循[左闭右开]规则 prin ...
- 使用Query Store监控性能
Query Store是SQL Server 2016中引入的语句性能监控和调优工具,它不仅自动捕获查询.执行计划和运行时统计信息的历史记录,而且还可以识别出由于执行计划更改而导致的性能差异,简化了性 ...
- 使用RNN进行imdb影评情感识别--use RNN to sentiment analysis
原创帖子,转载请说明出处 一.RNN神经网络结构 RNN隐藏层神经元的连接方式和普通神经网路的连接方式有一个非常明显的区别,就是同一层的神经元的输出也成为了这一层神经元的输入.当然同一时刻的输出是不可 ...
- P3954 成绩
题目描述 牛牛最近学习了C++入门课程,这门课程的总成绩计算方法是: 总成绩=作业成绩\times 20\%+×20%+小测成绩×30\%+×30%+期末考试成绩\times 50\%×50% 牛牛想 ...
- 【RN - 基础】之FlexBox弹性布局
前言 弹性盒模型(The Flexible Box Module),又叫FlexBox,意为“弹性布局”,旨在通过弹性的方式来对齐和分布容器中内容的空间,使其能适应不同的屏幕,为盒装模型提供最大的灵活 ...
- e = e || window.event的区别及用法
本文链接:https://blog.csdn.net/qq_41348029/article/details/81288481 e = e || window.event 在做事件处理时,用于区分IE ...
- PHP根据经纬度获取在范围坐标的数据
// 计算范围,可以做搜索用户 function GetRange($lat,$lon,$raidus){ //计算纬度 $degree = (24901 * 1609) / 360.0; $dpmL ...
- 01Shell入门02-echo和printf
输出方式 小知识 echo echo -e 可以控制字体颜色和背景颜色输出 示例 echo -e "\033[41;36m Hello world \033[0m" [root@h ...
- java访问数据库被拒绝,不能连接数据库ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
错误原因:mysql数据库只允许本地ip访问: 解决方法:修改mysql表设置所有ip都可以访问: 登录数据库 使用以下命令: use mysql; grant all privileges on * ...
- 一文读懂Python web框架和web服务器之间的关系
我们都知道 Python 作为一门强大的语言,能够适应快速原型和较大项目的制作,因此被广泛用于 web 应用程序的开发中. 在面试的过程中,大家或多或少都被问到过这样一个问题:一个请求从浏览器发出到数 ...