[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 ...
随机推荐
- C++自学成长之路(第一篇)
今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...
- 【WPF】两则动画效果
原文:[WPF]两则动画效果 引言 利用WPF的动画可以轻而易举的实现各种各样的特效,如擦除,滑动进入等,先看两个效果图 第一个效果 这个动画其实利用了OpacityMask和LinearGradie ...
- Selenium-ActionChainsApi接口详解
ActionChains 有时候我们在通过Selenium做UI自动化的时候,明明能够在DOM树内看到这个元素,但是我在通过driver click.sendkey的时候,就是点击不到或无法输入字符串 ...
- JS计算混合字符串长度
用的是正则表达式 var str = ”坦克是tank的音译”; var len = str.match(/[^ -~]/g) == null ? str.length : str.length + ...
- CSS布局的一些技巧
max-width 通常使元素水平居中用的较多的方法为: #main { width: 600px; margin: 0 auto; } 但是,当浏览器窗口比元素的宽度还要窄时,浏览器会显示一个水平滚 ...
- flask_admin 笔记四 自定义视图
定义自己的视图 对于您的要求非常具体的情况,您很难用内置的ModelView类来满足这些需求,Flask-Admin使您可以轻松地完全控制并将自己的视图添加到界面中. 1)独立视图 可以通过扩展Bas ...
- OpenCV调整彩色图像的饱和度和亮度
问题 如何调整彩色图像的饱和度和亮度 解决思路 详细步骤: 将RGB图像值归一化到[0, 1] 然后使用函数cvtColor进行色彩空间的转换 接下来可以根据处理灰度图像对比度增强伽马变换或者线性变换 ...
- cloudflare 加https、加SSL(加CF处理)实操流程
建站过程中,少不了SSL证书等cf添加操作,cf,即cloudflare的简写 首先,点击如图“Add site”,弹出输入框后,填写已在如阿里云.goDaddy.freedom等域名平台购买的域名: ...
- PAT甲题题解-1111. Online Map (30)-PAT甲级真题(模板题,两次Dijkstra,同时记下最短路径)
题意:给了图,以及s和t,让你求s到t花费的最短路程.最短时间,以及输出对应的路径. 对于最短路程,如果路程一样,输出时间最少的. 对于最短时间,如果时间一样,输出节点数最少的. 如果最短路程 ...
- python发送邮件脚本ssl 465端口
#coding:utf8 from smtplib import SMTP_SSL from email.header import Header from email.mime.text impor ...