Bzoj 1040 [ZJOI2008]骑士 题解
1040: [ZJOI2008]骑士
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 5368 Solved: 2044
[Submit][Status][Discuss]
Description
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会各
界的赞扬。最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争。战火绵延五百里,在和平环境
中安逸了数百年的Z国又怎能抵挡的住Y国的军队。于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一
个真龙天子的降生,带领正义打败邪恶。骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一
些矛盾。每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不会与自己最厌恶的人一同出
征的。战火绵延,人民生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给了你一个艰巨的任务,从所有
的骑士中选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的
情况),并且,使得这支骑士军团最具有战斗力。为了描述战斗力,我们将骑士按照1至N编号,给每名骑士一个战
斗力的估计,一个军团的战斗力为所有骑士的战斗力总和。
Input
第一行包含一个正整数N,描述骑士团的人数。接下来N行,每行两个正整数,按顺序描述每一名骑士的战斗力
和他最痛恨的骑士。
Output
应包含一行,包含一个整数,表示你所选出的骑士军团的战斗力。
Sample Input
10 2
20 3
30 1
Sample Output
HINT
N ≤ 1 000 000,每名骑士的战斗力都是不大于 1 000 000的正整数。
- #include <cstdlib>
- #include <cstdio>
- #include <cstring>
- #include <string>
- #include <queue>
- #include <algorithm>
- #include <cmath>
- #include <map>
- #define N 1000005
- using namespace std;
- int n,to[N],zz1,zz,a[N],b[N];
- long long va[N],vva[N];
- struct ro
- {
- int to,next,fr;
- }road2[N],road[N];
- void build2(int x,int y)
- {
- zz1++;
- road2[zz1].to=y;
- road2[zz1].next=b[x];
- b[x]=zz1;
- }
- void build(int x,int y,int z)
- {
- zz++;
- road[zz].fr=z;
- road[zz].to=y;
- road[zz].next=a[x];
- a[x]=zz;
- }
- int dfn[N],low[N],zz2,zz3,top,st[N],bel[N],sta[N],fa[N],size[N];
- bool rd[N],rd2[N];
- void tar(int x)
- {
- zz2++;top++;
- st[top]=x;
- dfn[x]=low[x]=zz2;
- rd[x]=rd2[x]=;
- for(int i=b[x];i>;i=road2[i].next)
- {
- int y=road2[i].to;
- if(!rd2[y])
- {
- tar(y);
- low[x]=min(low[x],low[y]);
- }
- else if(rd[y])
- {
- low[x]=min(dfn[y],low[x]);
- }
- }
- if(dfn[x]==low[x])
- {
- zz3++;
- int v;
- do{
- v=st[top];
- rd[v]=;
- top--;
- bel[v]=zz3;
- sta[zz3]=v;
- size[zz3]++;
- vva[zz3]+=va[v];
- }while(dfn[v]!=low[v]);
- }
- }
- long long f[N][],f2[N][][],f3[N][];
- void dfs2(int x,int fr,int tp)
- {
- if(x==tp&&fr)
- {
- f2[x][][]=max(f2[fr][][],f2[fr][][]);
- f2[x][][]=f2[fr][][];
- f[bel[x]][]=max(f2[x][][],f2[x][][]);
- return;
- }
- if(x==tp)
- {
- f2[x][][]+=f3[x][];
- f2[x][][]+=f3[x][];
- f2[x][][]+=va[x];
- }
- else
- {
- if(fr==tp)
- {
- f2[x][][]=f2[x][][]=f2[fr][][],f2[x][][]=f2[fr][][];
- f2[x][][]+=f3[x][];f2[x][][]+=va[x];
- f2[x][][]+=f3[x][];f2[x][][]+=f3[x][];
- }
- else
- {
- f2[x][][]=max(f2[fr][][],f2[fr][][]);
- f2[x][][]=max(f2[fr][][],f2[fr][][]);
- f2[x][][]=f2[fr][][];
- f2[x][][]=f2[fr][][];
- f2[x][][]+=va[x]+f3[x][];
- f2[x][][]+=va[x]+f3[x][];
- f2[x][][]+=f3[x][];
- f2[x][][]+=f3[x][];
- }
- }
- dfs2(to[x],x,tp);
- }
- void dfs1(int x)
- {
- for(int i=a[x];i>;i=road[i].next)
- {
- int y=road[i].to;
- dfs1(y);
- if(size[x]==)
- {
- f[x][]+=max(f[y][],f[y][]);
- f[x][]+=f[y][];
- }
- else
- {
- f3[road[i].fr][]+=max(f[y][],f[y][]);
- f3[road[i].fr][]+=f[y][];
- }
- }
- if(size[x]==)f[x][]+=vva[x];
- else
- {
- dfs2(sta[x],,sta[x]);
- }
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=;i<=n;i++)
- {
- scanf("%lld%d",&va[i],&to[i]);
- build2(to[i],i);
- }
- for(int i=;i<=n;i++)
- {
- if(!rd2[i])tar(i);
- }
- for(int i=;i<=n;i++)
- {
- for(int j=b[i];j>;j=road2[j].next)
- {
- int y=road2[j].to;
- if(bel[i]!=bel[y])
- {
- build(bel[i],bel[y],i);
- }
- }
- }
- for(int i=;i<=zz3;i++)
- {
- if(size[i]!=)
- {
- dfs1(i);
- }
- }
- long long ans=;
- for(int i=;i<=zz3;i++)
- {
- if(size[i]!=)
- {
- ans+=f[i][];
- }
- }
- printf("%lld\n",ans);
- return ;
- }
Bzoj 1040 [ZJOI2008]骑士 题解的更多相关文章
- [BZOJ 1040][ZJOI2008]骑士
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5403 Solved: 2060[Submit][Status ...
- BZOJ 1040: [ZJOI2008]骑士 基环加外向树
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1190 Solved: 465[Submit][Status] ...
- bzoj 1040: [ZJOI2008]骑士 環套樹DP
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1755 Solved: 690[Submit][Status] ...
- bzoj 1040: [ZJOI2008]骑士 树形dp
题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3054 Solved: 1162[Submit][S ...
- [BZOJ 1040] [ZJOI2008] 骑士 【基环+外向树DP】
题目链接:BZOJ - 1040 题目分析 这道题目的模型就是一个图,不一定联通,每个连通块的点数等于边数. 每个连通块都是一个基环+外向树.即树上增加了一条边. 如果是树,就可以直接树形DP了.然而 ...
- BZOJ 1040: [ZJOI2008]骑士 | 在基环外向树上DP
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题解: 我AC了 是自己写的 超开心 的 考虑断一条边 这样如果根节点不选答案一定正确 ...
- bzoj 1040 [ZJOI2008]骑士(基环外向树,树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1040 [题意] 给一个基环森林,每个点有一个权值,求一个点集使得点集中的点无边相连且权 ...
- BZOJ 1040: [ZJOI2008]骑士 [DP 环套树]
传送门 题意:环套树的最大权独立集 一开始想处理出外向树树形$DP$然后找到环再做个环形$DP$ 然后看了看别人的题解其实只要断开环做两遍树形$DP$就行了...有道理! 注意不连通 然后洛谷时限再次 ...
- BZOJ 1040: [ZJOI2008]骑士(基环树dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题意: 思路: 这是基环树,因为每个人只会有一个厌恶的人,所以每个节点只会有一个父亲节点,但是 ...
随机推荐
- .NET VS 自定义新建代码文件模板
参考:http://www.cnblogs.com/fightingtong/p/3765914.html 在VS中新建文件时,可使用模板在文件中生成指定内容.只需要把IDE安装目录下的模板进行修改保 ...
- win10 uwp 异步转同步
原文:win10 uwp 异步转同步 有很多方法都是异步,那么如何从异步转到同步? 可以使用的方法需要获得是否有返回值,返回值是否需要. 如果需要返回值,使用GetResults 如从文件夹获取文件: ...
- linux下计划任务学习记录
0x01 计划任务简介 linux 中计划任务主要分为”循环执行”和”只执行一次”两种,分别对应的时 crond 服务 和 atd 服务: 0x02 只执行一次的计划任务 0x02.1 atd 服务说 ...
- WPF 鼠标在图片Image上悬停时切换更改设置图片源Source
// 无效的写法,图片不会被切换 <Image Margin="0,0,0,0" Width="50" Height="50" Sou ...
- 简单实用SQL脚本Part:查找SQL Server 自增ID值不连续记录
原文:简单实用SQL脚本Part:查找SQL Server 自增ID值不连续记录 在很多的时候,我们会在数据库的表中设置一个字段:ID,这个ID是一个IDENTITY,也就是说这是一个自增ID.当并发 ...
- 浏览器禁用cookie后php如何保持session会话-use_trans_sid机制
原文:浏览器禁用cookie后php如何保持session会话-use_trans_sid机制 为防止浏览器禁用cookie导致服务器会话无法保持,php开发了一个机制,该机制开启后,浏览器发起请求后 ...
- Office Add-in Model 为 Outlook Mail Add-in 提供的 JavaScript API 介绍
本文所讨论的 Mailbox API是指在 Mail Add-in 中可调用的 JavaScript API.开发者可以利用这些API 实现 Add-in 和 Outlook 的交互(数据读取与写入) ...
- windows Service 之调试过程(附加到进程里调试,而且启动时间不能超过30秒)
最近第一次用C#写了一个windows service ,其实实现的内容比较简单.就是启动remoting 连接,但是调试相对初次写windws service 的我来说,比较烦.没有经验,而且没办法 ...
- 电商、P2P等大型互联网系统包含哪些业务模块?
01 前言 在互联网飞速发展的时代,各大互联网公司正在进行激烈的竞争,业务模式也在不断的扩张,这种现状使得目前各大公司的架构系统面临着极大的挑战,而对于我们普通的软件开发者而言,如果你仅仅了解过一些关 ...
- Linux/windows com串口 java 接收数据 并解析 web程序
1.首先应公司要求再 com 口本来使用 .net 由于 .net 适用 linux 太麻烦 改为java 准备工作 准备 RXTXconmm.jar(版本很重要) 因为版本问题我搞了一天. 主要讲述 ...