[ZJOI2008]骑士 题解
这道题稍微想一想就会联想到树形DP的入门题:没有上司的舞会;
但是再想一想会发现这根本就不是一颗树,因为它比树多了一条边;
这时候我们引入一个新的概念:基环树;
顾名思义(??),基环树就是在一颗树上填一条边构成的一个图;基环树也叫环套树(明明更像树套环)。
我们在树上可以做的事情基本都可以在基环树上实现:比如树形DP
基环树的基本解题思路就是找到在环上的两个点:S,T;
分别以S,T为根来跑一边DP,这样把两次的答案进行处理就可以解决掉这道题;
那么怎样找环?我总结了几种不同的思路:
1.并查集找环:对于要加入的两个点如果已经在同一个区域内,那么他们一定在环上;
2.tarjan找环:对于一个点,如果dfn[v]<dfn[u],那么u和v就在一个环上;
3.dfs找环:其实和tarjan的基本思路一样,如果一个点的子节点v已经被经过,那么u和v就在一个环上;
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct littlestar{
int to;
int nxt;
}star[2000010];
int head[2000010],cnt;
void add(int u,int v)
{
star[++cnt].to=v;
star[cnt].nxt=head[u];
head[u]=cnt;
}
int ha[1000010],fa[1000010];
int f[1000010],g[1000010],vis[1000010];
void dfs(int u,int goal)
{
vis[u]=1;
f[u]=ha[u];
for(int i=head[u];i;i=star[i].nxt){
int v=star[i].to;
if(v==goal){
f[v]=-999999999;
continue;
}
dfs(v,goal);
g[u]+=max(g[v],f[v]);
f[u]+=g[v];
}
}
int ans;
signed main()
{
int n; cin>>n;
for(register int i=1;i<=n;i++){
scanf("%d%d",&ha[i],&fa[i]);
add(fa[i],i);
}
for(register int i=1;i<=n;i++){
if(!vis[i]){
vis[i]=1;
int root=i;
while(!vis[fa[root]]){
root=fa[root];
vis[root]=1;
}
dfs(root,root);
int tmp=max(g[root],f[root]);
vis[root]=1;
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
root=fa[root];
dfs(root,root);
tmp=max(tmp,max(g[root],f[root]));
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
ans+=tmp;
}
}
cout<<ans;
}
然后可以双倍经验:洛谷 P1453 城市环路
#include <bits/stdc++.h>
using namespace std;
struct littlestar{
int to;
int nxt;
}star[200010];
int head[200010],cnt;
void add(int u,int v)
{
star[++cnt].to=v;
star[cnt].nxt=head[u];
head[u]=cnt;
}
int ha[100010],fa[100010];
double f[100010],g[100010];
void dfs(int u,int ff)
{
f[u]=ha[u];
g[u]=0;
for(int i=head[u];i;i=star[i].nxt){
int v=star[i].to;
if(v==ff){
continue;
}
dfs(v,u);
f[u]+=g[v];
g[u]+=max(g[v],f[v]);
}
}
inline int zhaobaba(int x)
{
if(fa[x]==x) return x;
return fa[x]=zhaobaba(fa[x]);
}
int S,T;
int main()
{
int n;
cin>>n;
for(register int i=1;i<=n;i++) scanf("%d",&ha[i]),fa[i]=i;
for(register int i=1;i<=n;i++){
int u,v;
scanf("%d%d",&u,&v);
++u;
++v;
if(zhaobaba(u)==zhaobaba(v)){
S=u;
T=v;
continue;
}
add(u,v);
add(v,u);
fa[zhaobaba(v)]=zhaobaba(u);
}
double ans=0,k;
scanf("%lf",&k);
dfs(S,0);
ans=g[S];
dfs(T,0);
ans=max(ans,g[T]);
printf("%.1lf",ans*k);
}
[ZJOI2008]骑士 题解的更多相关文章
- Bzoj 1040 [ZJOI2008]骑士 题解
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5368 Solved: 2044[Submit][Status ...
- P2607[ZJOI2008] 骑士 题解
题目 Z 国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的 Y 国发动了一场针对 Z 国的侵略战争.战火绵延五 ...
- BZOJ1040:[ZJOI2008]骑士——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1040 题面大意:n个人有一个价值和一个最恨的人,现在组出一个队伍使得价值最大且没有仇恨关系. ——— ...
- [ZJOI2008]骑士
[ZJOI2008]骑士 标签: DP 题目链接 题解 把边看成无向的. 其实就是求这个东西的最大独立集. 但是这不是树,怎么求呢? 其实还是一样的求法. 对于每一个连通块.最多有这个联通块的大小数目 ...
- [BZOJ 1040][ZJOI2008]骑士
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5403 Solved: 2060[Submit][Status ...
- 【BZOJ1040】[ZJOI2008]骑士 树形DP
[BZOJ1040][ZJOI2008]骑士 Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情 ...
- [ZJOI2008]骑士(基环树,树形dp)
[ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的 ...
- 「树形DP」洛谷P2607 [ZJOI2008]骑士
P2607 [ZJOI2008]骑士 题面: 题目描述 Z 国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的 ...
- BZOJ 1040: [ZJOI2008]骑士 基环加外向树
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1190 Solved: 465[Submit][Status] ...
随机推荐
- 51 Nod 1069 Nim游戏
分析: a1 xor a2 xor a3 ... xor an !=0 则为必胜态 a1 xor a2 xor a3 ... xor an ==0 则为必败态 也就是说只要计算异或值,如果非零则A赢, ...
- Topcoder SRM 674 Div.2题解
T1 解题思路 这题应该不是很难,主要是题意理解问题. 注意给出的两个数组里映射关系已经对应好了,只要判断是否为双射即可 参考程序 #include <bits/stdc++.h> usi ...
- 190707Python-Redis
一.Redis的简单使用 Redis操作模式 # Author:Li Dongfei import redis r = redis.Redis(host='192.168.56.7', port=63 ...
- 一、基础篇--1.2Java集合-ArrayList和Vector的区别
ArrayList和Vector的区别 ArrayList和Vector都是基于动态数组实现的. 区别 ArrayList是非线程安全的,Vector是线程安全的. Vector的方法都加了同步锁 ...
- mysql 5.7安装方法
yum方式安装rpm包形式,安装mysql的方法: 方法一: 使用yum方式,下载后离线安装mysql的安装包 安装前,先使用命令查看,确定系统未安装mysql安装包.彻底清除之前安装的mysql安装 ...
- 使用同步上下文进行C#与VBA代码和Excel之间的交互
原始出处:www.cnblogs.com/Charltsing/p/RunVBA.html 大家都知道,Excel是个STA,不允许在Excel忙的时候对其Com对象进行操作,也不允许同时有多个线程对 ...
- java:LeakFilling(Spring)
1.配置文件总结: bean节点: id:用户自定义名称,用于标识当前对象,可以通过getBean(String id)从容器中获取该对象. class:要交给spring容器创建的对象的全类名(包名 ...
- 借助marquee实现弹幕效果
HTML标签marquee实现滚动效果 .基于此,实现简易版 弹幕: HTML <div class="right_liuyan"> <marquee id=& ...
- LeetCode.1018-可被5整除的二进制数(Binary Prefix Divisible By 5)
这是小川的第379次更新,第407篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第241题(顺位题号是1018).给定0和1的数组A,考虑N_i:从A[0]到A[i]的第 ...
- 【HTTP】三、HTTP状态保持机制(Cookie和Session)
前面我们提到HTTP协议的特点:无连接.无状态.无连接带来的时间开销随着HTTP/1.1引入了持久连接的机制得到了解决.现在来关注其"无状态"的特点. 所谓的无状态,就是指 ...