[Coci2015]Kamp
Description
HINT
Solution
Code
#include<bits/stdc++.h>
using namespace std;
const int N=+;
typedef long long ll;
const ll inf=(1LL*<<);
int n,m;
struct node{
int nxt,to,val;
}e[*N];
int hd[N],cnt;
void add(int x,int y,int z){
e[++cnt].nxt=hd[x];
e[cnt].val=z;
e[cnt].to=y;
hd[x]=cnt;
}
ll dis[N];
bool exi[N];
bool has[N];
ll f[N],g[N];
ll hf[N],hg[N];
bool oh[N];
ll ans[N];
int ff[N];
void dfs(int x,int fa,ll d){
dis[x]=d;
ll sumf=;
bool fl=false;//fl记录是否是叶子
bool bla=false;//bla记录是否有一个子树里有关键点(不包括自己)
for(int i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
fl=true;
dfs(y,x,d+e[i].val);
ff[y]=x;
has[x]|=has[y];
if(has[y]){
bla=true;
sumf+=f[y]+e[i].val*;
}
}
if(!has[x]||!fl||!bla) {
f[x]=g[x]=;return;
}
f[x]=sumf;
g[x]=inf;
for(int i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
if(has[y]){
ll now=sumf-f[y]+g[y]-e[i].val;
g[x]=min(g[x],now);
}
}
}
void sol(int x,int fa){
if(x!=){
ll sumf=;
ll valf=;
oh[fa]=;//oh[fa]记得清0,因为可能这个fa会作为多个son的father
if(exi[fa]) oh[fa]=true;
for(int i=hd[fa];i;i=e[i].nxt){
int y=e[i].to;
if(y==x) {
valf=e[i].val;
continue;
}
else if(y==ff[fa]){
if(oh[y]){
oh[fa]=;
sumf+=hf[y]+*e[i].val;
}
}
else{
if(has[y]){
oh[fa]=;
sumf+=f[y]+*e[i].val;
}
}
} hf[fa]=sumf;
hg[fa]=inf;
if(oh[fa]){
bool son=false,bla=false;//son记录除了x是否有儿子。bla同上含义
for(int i=hd[fa];i;i=e[i].nxt){
int y=e[i].to;
if(y==x) continue;
son=true;
if(y==ff[fa]){
if(oh[y]){
bla=true;
ll now=sumf-hf[y]+hg[y]-e[i].val;
hg[fa]=min(hg[fa],now);
}
}
else if(has[y]){
bla=true;
ll now=sumf-f[y]+g[y]-e[i].val;
hg[fa]=min(hg[fa],now);
}
}
if(!son||!bla) hf[fa]=,hg[fa]=;
}
else{
hf[fa]=;
hg[fa]=;
} ll ansf=f[x],ansg=inf;//注意ansg=inf,当有子树至少存在一个关键点,ansg就可以得到正确答案
if(oh[fa]) ansf+=sumf+*valf; for(int i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa){
if(oh[fa]){
ll now=ansf-sumf+hg[fa]-e[i].val;
ansg=min(ansg,now);
}
}
else{
if(has[y]){
ll now=ansf-f[y]+g[y]-e[i].val;
ansg=min(ansg,now);
}
}
} ans[x]=ansg;
}
if(exi[x]&&m==){//全场只有一个关键点,特判,就是0了 ,否则由于ansg的锅,就成了inf
ans[x]=;
}
for(int i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
sol(y,x);
} }
int main()
{
scanf("%d%d",&n,&m);int x,y,z;
for(int i=;i<=n-;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}int t;
for(int i=;i<=m;i++){
scanf("%d",&t);
exi[t]=has[t]=;
}
dfs(,,);
ans[]=g[];
sol(,);
for(int i=;i<=n;i++){
printf("%lld\n",ans[i]);
}
return ;
}
正解:
[Coci2015]Kamp的更多相关文章
- 【BZOJ3743】[Coci2015]Kamp 树形DP
[BZOJ3743][Coci2015]Kamp Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举 ...
- bzoj3743 [Coci2015]Kamp 常州模拟赛d6t2
3743: [Coci2015]Kamp Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 484 Solved: 229[Submit][Status ...
- bzoj3743: [Coci2015]Kamp
首先树dp求出一个点的答案 然后再一遍dfs换根(是叫做换根吗.. 详见代码 #include <iostream> #include <cstdio> #include &l ...
- 2018.09.28 bzoj3743: [Coci2015]Kamp(树形dp)
传送门 这是一道很有意思的题. 我们把所有的关键点都提出来,当成一棵有边权的虚树. 然后发现虚树上除最后不回到虚根的那条路径外外每条边都会被走两遍. 显然要让答案最优,不走的路径应该在虚树的直径上,于 ...
- bzoj 3743: [Coci2015]Kamp【树形dp】
两遍dfs一遍向下,一边向上,分别记录子树内人数a,当前点到所有点的距离b,最大值c和次大值d,最大值子树p 然后答案是2b-c #include<iostream> #include&l ...
- [bzoj3743 Coci2015] Kamp(树形dp)
传送门 Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的 ...
- [Bzoj3743][Coci2015] Kamp【换根Dp】
Online Judge:Bzoj3743 Label:换根Dp,维护最长/次长链 题目描述 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的 ...
- bzoj 3743 [Coci2015]Kamp——树形dp+换根
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. “从根出发又回到根” 减去 “mx ” . 注意dfsx里真的要改那 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- 20155226 《网络攻防》 Exp1 PC平台逆向破解(5)M
20155226 <网络攻防> Exp1 PC平台逆向破解(5)M 实践目标 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串 该程序同时包含另一个代 ...
- 20155317《网络对抗》Exp4 恶意代码分析
20155317<网络对抗>Exp4 恶意代码分析 基础问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用 ...
- 20155328 《网络攻防》 实验一:PC平台逆向破解(5)M
20155328 <网络攻防> 实验一:PC平台逆向破解(5)M 实践目标 实践对象:linux可执行文件pwn1. 正常执行时,main调用foo函数,foo函数会简单回显任何用户输入的 ...
- Django高并发负载均衡
1 什么是负载均衡? 当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能.那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台 ...
- 用Visual Studio2017写C++静态库
造轮子是一件有趣的事情,VS是一个强大的工具,能胜任超大规模的工程,但是讲真,对不那么大的项目配置起来不是那么友好(网上的其他教程也一点都不友好Orz).这里就展示一下构建一个简单的静态库的正确姿势. ...
- Jenkins下载安装
Jenkins是什么? Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Jenkins可以用于一些测 ...
- 重磅发布丨乐维监控:全面兼容云平台,助力企业DevOps转型升级!
2019年伊始,我们迎来了乐维监控的又一重大功能更新——云平台监控,这将有效帮助企业将云上.云下数据聚合,方便统一化的监控管理与维护!未来,乐维监控每一次的产品功能及版本更新,我们都将第一时间于此发布 ...
- 通过sqli-labs学习sql注入——基础挑战之less1
环境准备: Phpstudy (PHP+Apache+Mysql) Sql-lab 首先了解下基础知识: URL编码: 因为在浏览器中,当我们访问一个网址的时候,浏览器会自动将用户输入的网址进行UR ...
- 腾讯 深圳 25928-PHP开发工程师(深圳)
工作地点:深圳 职位类别:技术类 招聘人数:1人 工作职责: 负责游戏研运体系流程工具及相关产品的开发.维护: 参与支撑系统的需求分析.设计.编码: 承担外包开发成员技术导师,解决技术难点,把控开发质 ...
- #个人博客作业Week1----关于软件和软件工程的出现
1.软件工程这个词如何出现的? 数学与电脑科学先锋Margaret Hamilton在开发阿波罗11号软件的期间发明的,目的是将软件与硬件还有其他工程学类做出区别,为软件以及那些发明者争取应有的正统性 ...