树形DP。由于n只有5000,可以直接枚举边。

枚举边,将树分成两个子树,然后从每个子树中选出一个点分别为u,v,那么答案就是:

子树1中任意两点距离总和+子树2中任意两点距离总和+子树1中任意一点到u的距离和*子树2的节点个数+子树2中任意一点到v的距离和*子树1的节点个数+子树1的节点个数*子树2的节点个数*当前枚举边的权值。

当枚举的边一定时,那么要选取的点就是子树中到所有点的距离总和最小的点。对树进行dfs,同时记录子树的节点个数,所有孩子节点到当前根节点的距离总和,以及当前子树中任意两点距离和。然后在进行dfs求解到该子树中所有点距离和最小的点。

 #include <stdio.h>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair <int, int> pii;
#define maxn 5005
#define INF 0x3f3f3f3f3f3f3f3fll int f[maxn], h[maxn], w[maxn];
vector<pii> g[maxn];
int son[maxn];
LL d[maxn], s[maxn]; void dfs(int v, int rt){
son[v] = , d[v] = , s[v] = ;
for(int i = ; i != g[v].size(); i ++){
int u = g[v][i].first;
if(u==rt) continue;
dfs(u, v);
s[v] += s[u] + d[u]*son[v] + d[v]*son[u] + (LL)son[u] * son[v] * g[v][i].second;
d[v] += d[u] + (LL)son[u] * g[v][i].second;
son[v] += son[u];
}
son[v] ++;
s[v] += d[v];
}
void dfsw(int v, int rt, LL &minn){
minn = min(d[v], minn);
for(int i = ; i != g[v].size(); i ++){
int u = g[v][i].first;
if(u==rt) continue;
d[u] = d[u] + (d[v] - d[u] - (LL)son[u]*g[v][i].second) + (LL)(son[v] - son[u])*g[v][i].second;
son[u] = son[v];
dfsw(u, v, minn);
}
}
int main(){
//freopen("test.in", "r", stdin);
for(int n; scanf("%d", &n)!=EOF; ){
for(int i = ; i <= n; i ++){
g[i].clear();
}
for(int i = , x, y, z; i < n; i ++){
scanf("%d%d%d", &x, &y, &z);
f[i] = x, h[i] = y, w[i] = z;
g[x].push_back(make_pair(y, z));
g[y].push_back(make_pair(x, z));
}
LL ans = INF, minn = INF, sum = ;
for(int i = ; i < n; i ++){
minn = INF;
dfs(f[i], h[i]);
dfsw(f[i], h[i], minn);
sum = ;
sum = (n - son[f[i]]) * minn + s[f[i]];
minn = INF;
dfs(h[i], f[i]);
dfsw(h[i], f[i], minn);
sum = sum + (n - son[h[i]]) * minn + s[h[i]] + (LL)son[f[i]]*son[h[i]]*w[i];
ans = min(ans, sum);
}
printf("%I64d\n", ans);
}
return ;
}

Codeforces 294E Shaass the Great的更多相关文章

  1. CodeForces - 294A Shaass and Oskols

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  2. Codeforces 294D - Shaass and Painter Robot

    294D - Shaass and Painter Robot 思路: 可以用数学归纳法证明一个结论:整个棋盘黑白相间当且仅当边缘黑白相间. 分奇偶讨论又可得出边缘黑色格个数为n+m-2 这样就可以暴 ...

  3. Codeforces 294B Shaass and Bookshelf:dp

    题目链接:http://codeforces.com/problemset/problem/294/B 题意: 有n本书,每本书的厚度为t[i],宽度为w[i] (1<=t[i]<=2, ...

  4. Codeforces K. Shaass and Bookshelf(动态规划三元组贪心)

    题目描述: B. Shaass and Bookshetime limit per test    2 secondsmemory limit per test 256 megabytesinput  ...

  5. Codeforces 294B Shaass and Bookshelf(记忆化搜索)

    题目 记忆化搜索(深搜+记录状态) 感谢JLGG //记忆话搜索 //一本书2中状态,竖着放或者横着放 //初始先都竖着放,然后从左边往右边扫 #include<stdio.h> #inc ...

  6. CodeForces 294B Shaass and Bookshelf 【规律 & 模拟】或【Dp】

    这道题目的意思就是排两排书,下面这排只能竖着放,上面这排可以平着放,使得宽度最小 根据题意可以得出一个结论,放上这排书的Width 肯定会遵照从小到大的顺序放上去的 Because the total ...

  7. OUC_OptKernel_oshixiaoxiliu_好题推荐

    poj1112 Team Them Up! 补图二分图+dp记录路径codeforces 256A Almost Arithmetical Progression dp或暴力 dp[i][j] = d ...

  8. Codeforces Round #178 (Div. 2) B. Shaass and Bookshelf —— DP

    题目链接:http://codeforces.com/contest/294/problem/B B. Shaass and Bookshelf time limit per test 1 secon ...

  9. Codeforces Round #178 (Div. 2) B .Shaass and Bookshelf

    Shaass has n books. He wants to make a bookshelf for all his books. He wants the bookshelf's dimensi ...

随机推荐

  1. MongoDB笔记(四)基本管理命令

    MongoDB命令帮助系统 基本命令及实例 一基本命令 二基本DDL和DML 三启动与终止 四安全管理 五数据备份恢复与迁移管理 六远程连接管理   MongoDB是一个NoSQL数据库系统:一个数据 ...

  2. Netty源码阅读(一) ServerBootstrap启动

    Netty源码阅读(一) ServerBootstrap启动 转自我的Github Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速 ...

  3. 初识pngdrive

    初识是第一次认识的意思,类似的词还有初见.初遇.初心.初愿.初恋.初吻……梦里相见如初识,很美好的感觉.同样,今天我们要认识的也是一个比较神奇美妙的东西,至少对于程序员来说. 我曾经尝试过很多文件加密 ...

  4. jsonp多次请求报错 not a function的解决方法

    添加时间戳给callbackId $.ajax({ type: "get", url: url, timeout: 6000, data: param, cache: false, ...

  5. JSON知多少-JSON数据结构

    最近在开发微信平台,要使用JSON进行数据交换,之前用过JSON,但仅限于…… 在开发微信平台中,要使用JSON形式如下:代码片断1: { "button":[ { "t ...

  6. MySQL簇-cluster

    http://www.php100.com/manual/MySQL/ndbcluster.html 先做个标记吧.

  7. python【第二十篇】Django表的多对多、Ajax

    1 创建多对多表的方式有两种 1.1 方式一:自定义关系表 class Host(models.Model): nid = models.AutoField(primary_key=True) hos ...

  8. jquery直接获取html页面元素

    大家都会用$('div')来获取div并对其进行一些操作,今天用到一个函数发现$('div')与getElementBy系列函数得到的对象并不一样. 然后去查了下,发现$('div')得到的是一个数组 ...

  9. c#开发Mongo笔记第一篇

    现在开发的这个项目要用mongo数据库开发,发现网上的这方面教程还是比较少的,只能边看官方说明边进行开发,再开发过程中写下笔记,也算上是一个总结吧. 我开发使用的是vs2013了,驱动用的是最新的1. ...

  10. Nth Digit | leetcode

    Find the nth digit of the infinite integer sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... Note: n i ...