码迷,mamicode.com
首页 > 其他好文 > 详细

[CF434D Div1] Tree

时间:2019-10-16 00:23:43      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:display   i+1   sum   连接点   格式   最小   mat   ret   str   

问题描述

给定一颗 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

标签:display   i+1   sum   连接点   格式   最小   mat   ret   str   

原文地址:https://www.cnblogs.com/LSlzf/p/11681876.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!