我們首先發現,每一條邊都至少走1次,因為我們必須走到每一個節點按按鈕

如果我們不走一個節點,說明這個節點已經有傳送門了,但是必須走到這個節點開傳送門,矛盾

然後我們發現,每一條邊至多經過2次

如果我們將傳送門設置在一個祖先,則邊fa->i會經過兒子個數次

但是如果將傳送門設置在兒子u處,則邊fa->i只會經過2次,更優

我們再次發現,傳送的位置和第一個傳送門有關係,而和第二個無關

所以我們可以先設置兒子的傳送門,再設置父親的傳送門

顯然,設置傳送門可以讓一些邊只走1次,我們可以計算最優方案

記dp[i][0/1]表示在/不在i點設置傳送門的單邊權值之和

若設置傳送門於祖先,則為了保證祖先的邊只走2次或者以下,則只能放一個孩子到祖先,其他都老老實實的走2遍

所以dp[i][1]=max(dp[i][1],dp[v[i]][1]+w[i])

若設置傳送門于當前點或者孩子,那麼我們可以走孩子邊

由於我們設置傳送門在孩子不會影響到父親,所以我們可以綜合選和不選的方案

所以dp[i][0]= sigma max(dp[v[i]][0],dp[v[i]][1]+w[i])

表示現在我們在v[i]設置傳送門的方案,與不在v[i]設置傳送門的方案

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

ll n,v[2000010],w[2000010],nxt[2000010],ec,h[1000010],dp[1000010][2];

void add(ll x,ll y,ll z){v[++ec]=y;w[ec]=z;nxt[ec]=h[x];h[x]=ec;}

void dfs(ll x,ll p){

for(ll i=h[x];i;i=nxt[i])

if(p!=v[i]){

dfs(v[i],x);

dp[x][1]=max(dp[x][1],dp[v[i]][1]+w[i]);

dp[x][0]+=max(dp[v[i]][0],dp[v[i]][1]+w[i]);

}

}

int main(){

freopen(“portal.in”,“r”,stdin);

freopen(“portal.out”,“w”,stdout);

ll ans=0;

scanf("%lld",&n);

for(ll i=1;i<n;i++){

ll a,b,c;

scanf("%lld%lld%lld",&a,&b,&c);

ans+=c*2;

add(a,b,c);add(b,a,c);

}

dfs(1,0);

printf("%lld",ans-dp[1][0]);

}

jzoj5906的更多相关文章

  1. <JZOJ5906>传送门

    emmm dpdpdp然鹅我考场上并想不到 还是凉凉 #include<cstdio> #include<cmath> #include<iostream> #in ...

  2. NOIP前的刷题记录

    因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数   组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...

随机推荐

  1. PAT 1044 火星数字(20)(思路+代码)

    1044 火星数字(20)(20 分) 火星人是以13进制计数的: 地球人的0被火星人称为tret. 地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jl ...

  2. 那些我离不开的 Sketch 插件

    当谈论到插件时,我是一名极客.各种新颖的 Sketch 插件层出不穷,但是有那么几个是我怎么也离不开的. Sketch 运行器 多层的插件菜单再也不会影响我的效率了. 我推迟了好几年才使用这个插件,因 ...

  3. Linux sudo 错误:XXX is not in the sudoers file 解决办法

    最近在学习linux,在某个用户(xxx)下使用sudo的时候,提示以下错误:xxx is not in the sudoers file. This incident will be reporte ...

  4. 经典递归问题:0,1背包问题 kmp 用遗传算法来解背包问题,hash表,位图法搜索,最长公共子序列

    0,1背包问题:我写笔记风格就是想到哪里写哪里,有很多是旧的也没删除,代码内部可能有很多重复的东西,但是保证能运行出最后效果 '''学点高大上的遗传算法''' '''首先是Np问题的定义: npc:多 ...

  5. spring mvc 用cookie和拦截器实现自动登录(/免登录)

    Cookie/Session机制详解:http://blog.csdn.net/fangaoxin/article/details/6952954 SpringMVC记住密码功能:http://blo ...

  6. 数据库面试sql

    问题一:.有三张表,学生表S,课程表C,学生课程表SC 01:写出建表语句 答: create table s(id integer primary key,name varchar(20)); cr ...

  7. timescale

    `timescale 1ns/100ps     表示时延单位为1ns, 时延精度为100ps.`timescale 编译器指令在模块说明外部出现, 并且影响后面所有的时延值.

  8. 批量 truncate 表

    如果某个用户下所有表或指定表中所有的数据已确定不再需要,此时可以进行批量 truncate declare cursor cur_trunc is select table_name from use ...

  9. cmake检测g++编译器是否支持c++11

    # 相关链接:https://cmake.org/cmake/help/v3.0/module/CheckCXXCompilerFlag.html​​include(CheckCXXCompilerF ...

  10. Android属性动画之ValueAnimator的介绍

    之前两篇博客,介绍的是ObjectAnimator作用与某一个控件的某一个属性.但我们的ValueAnimator它本身并不会作用与任何一个属性,它本身也不会提供任何一种动画.它简单的来说,就是一个数 ...