[CF434D Div1] Tree

Posted lslzf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF434D Div1] Tree相关的知识,希望对你有一定的参考价值。

问题描述

给定一颗 n 个点的树,树边带权,试求一个排列 P,使下式的值最大
[ sum_{i=1}^{n-1}maxflow(P_i,P_{i+1}) ]
其中 maxflow(s, t) 表示从点 s 到点 t 之间的最大流,即从 st 的路径上最小的边权。

输入格式

第一行一个整数 n,表示点数

下接 n 1 行,每行三个数 u, v, w 表示一条连接点 u 和点 v 权值为 w 的边

输出格式

输出一行一个整数,表示答案

样例输入

2

1 2 2333

样例输出

2333

数据范围

对于前 5% 的数据满足 n ≤8

对于前 40% 的数据满足 n ≤200

对于前 60% 的数据满足 n ≤2000

对于 100% 的数据满足 n≤100000

解析

考虑如何才能使题中所给的式子最小。我们从小往大加边,自然我们想要使小的边出现的越少越好,所以假设这条边为(u,v),最后的排列一定长这样:
[ P_1,P_2,P_3,...P_{k},u,v,P_{k+3},P_{k+4},...,P_n ]
即该边两侧的点在排列中分别处于两个端点的两边。由此,最后我们一定能做到每条边只记一次贡献。最后的答案即为所有边权之和。

代码

#include <iostream>
#include <cstdio>
#define int long long
using namespace std;
int n,i,ans;
signed main()
{
    freopen("tree.in","r",stdin);
    freopen("tree.out","w",stdout);
    cin>>n;
    for(i=1;i<n;i++){
        int u,v,w;
        cin>>u>>v>>w;
        ans+=w;
    }
    cout<<ans<<endl;
    return 0;
}

以上是关于[CF434D Div1] Tree的主要内容,如果未能解决你的问题,请参考以下文章

代码源 Div1 - 109#454. Minimum Or Spanning Tree(最小生成树,边权按位或,贪心,并查集) CF1624G

代码源 Div1 - 107#452. 序列操作(思维)CF1198B

代码源 Div1 - 107#452. 序列操作(思维)CF1198B

CF174 div1 B. Cow Program 记忆化搜索

CF1083(div1)

CF#462 div1 D:A Creative Cutout