题目大意:

给你一棵n个结点树,然后根据这棵树构造一个完全图,求完全图的一条最长的哈密顿路径。

构造方式是,完全图中的dis(u, v)就等于树上的u和v的距离。

题解:

这。。。这。。不就是杜教的那个题

还是弱化版的orz

需要注意的是,不是完全一样,这个题求的是哈密顿回路,需要删除一个最小的路径

答案就很简单了,找到重心以后。

如果有一棵子树大小为(n+1)/2,那么就只能删除连向那个子树的边

如果没有,那么就遍历一遍所有连向重心的边,选一个最小的删除即可。

杜教题连接 http://www.cnblogs.com/Saurus/p/7077966.html

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#define fi first
#define se second
using namespace std;
const int maxn = 1e5 + ;
typedef long long LL;
typedef pair<int, long long> PLI;
typedef pair<int, int> PII;
vector<PLI> G[maxn];
set<PII> S;
int son[maxn], sz[maxn];
int tree[maxn*];
int n, tot;
LL ANS = , Min = 1e18;
void dfs0(int x, int fa){
sz[x] = ;
for(auto e : G[x]){
if(e.fi == fa) continue;
dfs0(e.fi, x);
sz[x] += sz[e.fi];
son[x] = max(son[x], sz[e.fi]);
}
son[x] = max(son[x], n - sz[x]);
} void dfs(int x, int fa, LL v){
sz[x] = ;
for(auto e : G[x]){
if(e.fi == fa) continue;
dfs(e.fi, x, e.se+v);
sz[x] += sz[e.fi];
}
ANS += v;
} int main()
{
cin>>n;
for(int i = ; i < n; i++){
int x, y, w;
cin>>x>>y>>w;
G[x].push_back({y, w});
G[y].push_back({x, w});
}
int X;
dfs0(, );
for(int i = ; i <= n; i++) if(son[i] <= n/) X = i;
dfs(X, X, );
for(auto e : G[X]){
if(sz[e.fi] == (n+)/) { Min = e.se; break; }
Min = min(e.se, Min);
}
cout<<ANS* - Min<<endl;
}

AGC018D Tree and Hamilton Path(树+树的重心)的更多相关文章

  1. AtCoder Grand Contest 018 D - Tree and Hamilton Path

    题目传送门:https://agc018.contest.atcoder.jp/tasks/agc018_d 题目大意: 给定一棵\(N\)个点的带权树,求最长哈密顿路径(不重不漏经过每个点一次,两点 ...

  2. D - Tree and Hamilton Path

    题意 给一棵树,问一个排列,使得按顺序走过这些点的路径最长. N<=100000 解法 为了能让每条边被经过的次数达到上界, 我们首先找出重心, 然后容易得出一种排列方案,使得答案为以重心为根的 ...

  3. Merkle Tree(默克尔树)算法解析

    Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树.Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值.非叶节点 ...

  4. 转 Merkle Tree(默克尔树)算法解析

    Merkle Tree概念  Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树.Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值.非叶节 ...

  5. 区块链~Merkle Tree(默克尔树)算法解析~转载

    转载~Merkle Tree(默克尔树)算法解析 /*最近在看Ethereum,其中一个重要的概念是Merkle Tree,以前从来没有听说过,所以查了些资料,学习了Merkle Tree的知识,因为 ...

  6. Linux下的tree命令 --Linux下目录树查看

    Linux下的tree命令 --Linux下目录树查看 有时我们需要生成目录树结构,可以使用的有ls -R,但是实际效果并不好 这时需要用到tree命令,但是大部分Linux系统是默认不安装该命令的, ...

  7. ACM学习历程——POJ3321 Apple Tree(搜索,线段树)

          Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will ...

  8. 【整理】iview Tree数据格式问题,无限递归树处理数据

    iview Tree数据格式问题,无限递归树处理数据 https://juejin.im/post/5b51a8a4e51d455d6825be20

  9. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

随机推荐

  1. Tools - GitBook

    GitBook图书绑定自定义的域名 https://jingyan.baidu.com/article/335530daf86c3b19cb41c3f3.html

  2. 使用公共的存储过程实现repeater的分页

    当一个项目repeater分页多的时候使用公共的存储过程实现分页,是不错的选择 ALTER PROC [dbo].[P_Common_proc] -- 通用分页存储过程 @TableName varc ...

  3. Laravel -- 模型

    模型文件 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Student extends Model { / ...

  4. PHP入门笔记--基础语法一

    一.基本语法 php标记 <?php ?> php代码结束标记 三种注释 // /**/ # 二.类型 四种标量类型:boolean, integer, float, string 三种复 ...

  5. Hadoop(4)-Hadoop集群环境搭建

    准备工作 开启全部三台虚拟机,确保hadoop100的机器已经配置完成 分发脚本 操作hadoop100 新建一个xsync的脚本文件,将下面的脚本复制进去 vim xsync #这个脚本使用的是rs ...

  6. C语言实现简易扫雷

    首先,写代码之前要将整体思路写出来: 扫雷游戏:1.需要两个二维数组,一个用来展示,一个用来放雷; 2.整体骨架在代码中都有注释说明; 3.游戏难度比较简单,适合初学者观看,如果有大佬看明白,可以指点 ...

  7. POJ-2421-Constructing Roads(最小生成树 普利姆)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26694   Accepted: 11720 Description The ...

  8. TRANSLATE(转换大/小写并替换字符)

    可以将字母 转换大/小 写或使用替 换规则. 要转换大/小 写,请使用 TRANSLATE 语句,用法 如下: 语法 TRANSLATE <c> TO UPPER CASE. TRANSL ...

  9. BZ 600题祭

    不知不觉就600题了呢. 明天就要省选了.不要让这个数字定格在这里吧!

  10. 高德API+Python解决租房问题(.NET版)

    源码地址:https://github.com/liguobao/58HouseSearch 在线地址:58公寓高德搜房(全国版):http://codelover.link:8080/ 周末闲着无事 ...