LOJ10162 骑士
ZJOI 2008
Z 国的骑士团是一个很有势力的组织,帮会中聚集了来自各地的精英。他们劫富济贫,惩恶扬善,受到了社会各界的赞扬。
可是,最近发生了一件很可怕的事情:邪恶的 Y 国发起了一场针对 Z 国的侵略战争。战火绵延五百里,在和平环境中安逸了数百年的 Z 国又怎能抵挡得住 Y 国的军队。于是人们把所有希望都寄托在了骑士团身上,就像期待有一个真龙天子的降生,带领正义打败邪恶。
骑士团是肯定具备打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾。每个骑士有且仅有一个他自己最厌恶的骑士(当然不是他自己),他是绝对不会与最厌恶的人一同出征的。
战火绵延,人们生灵涂炭,组织起一个骑士军团加入战斗刻不容缓!国王交给你了一个艰巨的任务:从所有骑士中选出一个骑士军团,使得军内没有矛盾的两人,即不存在一个骑士与他最痛恨的人一同被选入骑士团的情况,并且使这支骑士军团最富有战斗力。
为描述战斗力,我们将骑士按照 1 至 N 编号,给每位骑士估计一个战斗力,一个军团的战斗力为所有骑士的战斗力之和。
输入格式
输入第一行包含一个正整数 N,描述骑士团的人数;
接下来 N 行每行两个正整数,按顺序描述每一名骑士的战斗力和他最痛恨的骑士。
输出格式
输出包含一行,一个整数,表示你所选出的骑士军团的战斗力。
样例
样例输入
3
10 2
20 3
30 1
样例输出
30
数据范围与提示
对于 30% 的数据,满足 N≤10;
对于 60% 的数据,满足 N≤100;
对于 80% 的数据,满足N≤10^4;
对于 100% 的数据,满足 N≤10^6,且每名骑士的战斗力都是不大于 10^6 的正整数。
_____________________________________________________________________________________________
树形动归,n个点,n条边,那么整个图构成多个联通块,每个块内要么是一棵树,要么是一棵树加一条边构成一个环。
如果是树,直接动归就可以了。
f[u][0]:表示不选当前点的最大战力
f[u][1]:表示选当前点的最大战力
f[u][0]=sum( max( f[v][0],f[v][1] ) )
f[u][1]=sum( f[v][0] )+zl[u];
如果内部是一个树加边,那么环上断开一条边,边的两个端点u,v,他们不能同时取。所以只要求f[u][0]和f[v][0]的较大值就可以了。
_____________________________________________________________________________________________
1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const int maxn=1e6+10;
5 int n;
6 long long ans;
7 ll zl[maxn];
8 int hen[maxn];
9 struct edge
10 {
11 int u,v,nxt;
12 }e[maxn<<1];
13 int head[maxn],js;
14 void addage(int u,int v)
15 {
16 e[++js].u=u;e[js].v=v;
17 e[js].nxt=head[u];head[u]=js;
18 }
19 bool vis[maxn];
20 long long f[maxn][2];
21 int h1,h2,bz=0,root;
22 void dfs(int u,int fa)
23 {
24 if(vis[u]==0)
25 {
26 vis[u]=1;
27 }
28 else
29 {
30 h1=u;h2=fa;bz=1;
31 return;
32 }
33 for(int i=head[u];i;i=e[i].nxt)
34 {
35 int v=e[i].v;
36 if(v!=fa)dfs(v,u);
37 }
38 }
39 void dp(int u,int fa)
40 {
41 f[u][0]=0;
42 f[u][1]=zl[u];
43 for(int i=head[u];i;i=e[i].nxt)
44 {
45 int v=e[i].v;
46 if(v!=fa && v!=root)
47 {
48 dp(v,u);
49 f[u][0]+=max(f[v][0],f[v][1]);
50 f[u][1]+=f[v][0];
51 }
52 }
53 }
54 int main()
55 {
56 scanf("%d",&n);
57 for(int i=1;i<=n;++i)
58 {
59 scanf("%d%d",&zl[i],&hen[i]);
60 if(hen[hen[i]]==i)continue;
61 addage(i,hen[i]);
62 addage(hen[i],i);
63 }
64 for(int i=1;i<=n;++i)
65 if(!vis[i])
66 {
67 h1=h2=bz=0;
68 dfs(i,0);
69 if(bz==0)
70 {
71 root = i;
72 dp(i,0);
73 ans+=max(f[i][0],f[i][1]);
74 }
75 else
76 {
77 root=h1;dp(h1,h2);long long tp=f[h1][0];
78 root=h2;dp(h2,h1);
79 ans+=max(tp,f[h2][0]);
80 }
81 }
82 cout<<ans;
83 return 0;
84 }
LOJ10162 骑士的更多相关文章
- COGS746. [网络流24题] 骑士共存
骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...
- 【BZOJ1671】[Usaco2005 Dec]Knights of Ni 骑士 BFS
[Usaco2005 Dec]Knights of Ni 骑士 Description 贝茜遇到了一件很麻烦的事:她无意中闯入了森林里的一座城堡,如果她想回家,就必须穿过这片由骑士们守护着的森林.为 ...
- 骑士游历/knight tour - visual basic 解决
在visual baisc 6 how to program 中文版第七章的练习题上看到了这个问题,骑士游历的问题. 在8x8的国际象棋的棋盘上,骑士(走法:一个方向走两格,另一个方向一格)不重复走完 ...
- BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1800 Solved: 984[Submit][Statu ...
- BZOJ 1040 【ZJOI2008】 骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...
- 【BZOJ-1040】骑士 树形DP + 环套树 + DFS
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3312 Solved: 1269[Submit][Status ...
- BZOJ1040 [ZJOI2008]骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...
- BFS 骑士的移动
骑士的移动 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/E 题目: Description A f ...
- LA 3523 圆桌骑士
题目链接:http://vjudge.net/contest/141787#problem/A http://poj.org/problem?id=2942 此题很经典 知识点:DFS染色,点-双连通 ...
随机推荐
- AWS中国区使用https访问部署在S3上的网站
问题描述 最近一个项目需要通过https的方式访问部署在S3上的网站,通过搜索引擎找到一篇文章,可以在AWS Global实现整个过程.但是目前AWS中国区有限制,CloudFront不能使用AWS ...
- java时间的一些处理
获取当前时间 System.currentTimeMillis() //第一种 Date date = new Date(); System.out.println(date.getTime()); ...
- JavaDailyReports10_12
运算级自增自减运算符大于取值运算符*,大于取地址运算符! 1 #include<stdio.h> 2 #include<string.h> 3 #define OK 1 4 # ...
- C#设计模式——建造者模式(Builder Pattern)
1.建造者模式简介 1.1>.定义 建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 1.2>.使用频率 中低 1.3>.原型模式应用 ...
- Linux操作系统的文件目录结构
一 --- 导读 首先记住一句经典的话:"linux世界中,万事万物皆为文件" 二---linux的目录结构示意图和windows下的目录结构示意图(本图需要背诵) 三---各目录 ...
- 笔记:学习go语言的网络基础库,并尝试搭一个简易Web框架
在日常的 web 开发中,后端人员常基于现有的 web 框架进行开发.但单纯会用框架总感觉不太踏实,所以有空的时候还是看看这些框架是怎么实现的会比较好,万一要排查问题也快一些. 最近在学习 go 语言 ...
- Go GRPC 入门(一)
前言 微服务相关 使用 GRPC 通讯的 Golang 微服务入门 举例写一个微服务,接收网址发送请求获取返回结果返回 正文 安装工具 安装 protobuf 这是 proto 文件的编译器 点我下载 ...
- MySQL select if 查询最后一个主键 id
查询最后一个主键id SELECT IF(MAX(id) IS NULL, 0, MAX(id)) AS maxid FROM users; 查询最小的主键id SELECT IF(MIN(id) I ...
- 【Oracle】sum(..) over(..)用法分析
今天再看sql优化详解的时候,提到了一个sum(..) over(..) 于是自己实验并在网上找了相关的一些文章来看 下面创建一张表: create sequence xulie increment ...
- ctfhub技能树—web前置技能—http协议—基础认证
打开靶机环境 下载附件后发现是常用密码字典,于是考虑本题可能是考察密码爆破 打开环境 发现需要认证,于是考虑使用暴力破解 使用burpsuite抓包,查看 发现最下面一行有加密后的密文 使用base6 ...