配对

来源:互联网 发布:淘宝怎么绑定手机号 编辑:程序博客网 时间:2024/04/28 18:28
给出一棵n个点的树,将这n个点两两配对,求所有可行的方案中配对两点间的距离的总和最大为多少。
Input
一个数n(1<=n<=100,000,n保证为偶数)接下来n-1行每行三个数x,y,z表示有一条长度为z的边连接x和y(0<=z<=1,000,000,000)
Output
一个数表示答案
Input示例
61 2 11 3 11 4 13 5 14 6 1
Output示例
7//配对方案为(1,2)(3,4)(5,6)
#include <iostream>#include <vector>using namespace std;typedef long long int ll;const int MAXN = 1e5 + 5;struct Edge{    Edge(int t, int l)    {        to = t;        len = l;    }    int to;    int len;};vector<Edge> edges[MAXN];ll result = 0;int n;ll dfs(int u, int prev){    ll num = 1;    for (int i = 0; i < edges[u].size(); i++)    {        int to = edges[u][i].to;        if (to == prev)        {            continue;        }        int len = edges[u][i].len;        ll childNum = dfs(to, u);        num += childNum;        childNum = min(childNum, n - childNum);        result += childNum * len;    }    return num;}int main(){    cin >> n;    int x, y, z;    for (int i = 0; i < n-1; i++)    {        cin >> x >> y >> z;        edges[x].push_back(Edge(y, z));        edges[y].push_back(Edge(x, z));    }    dfs(1, -1);    cout << result << endl;    return 0;}


原创粉丝点击