Codeforces 294E Shaass the Great
树形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的更多相关文章
- CodeForces - 294A Shaass and Oskols
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- Codeforces 294D - Shaass and Painter Robot
294D - Shaass and Painter Robot 思路: 可以用数学归纳法证明一个结论:整个棋盘黑白相间当且仅当边缘黑白相间. 分奇偶讨论又可得出边缘黑色格个数为n+m-2 这样就可以暴 ...
- Codeforces 294B Shaass and Bookshelf:dp
题目链接:http://codeforces.com/problemset/problem/294/B 题意: 有n本书,每本书的厚度为t[i],宽度为w[i] (1<=t[i]<=2, ...
- Codeforces K. Shaass and Bookshelf(动态规划三元组贪心)
题目描述: B. Shaass and Bookshetime limit per test 2 secondsmemory limit per test 256 megabytesinput ...
- Codeforces 294B Shaass and Bookshelf(记忆化搜索)
题目 记忆化搜索(深搜+记录状态) 感谢JLGG //记忆话搜索 //一本书2中状态,竖着放或者横着放 //初始先都竖着放,然后从左边往右边扫 #include<stdio.h> #inc ...
- CodeForces 294B Shaass and Bookshelf 【规律 & 模拟】或【Dp】
这道题目的意思就是排两排书,下面这排只能竖着放,上面这排可以平着放,使得宽度最小 根据题意可以得出一个结论,放上这排书的Width 肯定会遵照从小到大的顺序放上去的 Because the total ...
- OUC_OptKernel_oshixiaoxiliu_好题推荐
poj1112 Team Them Up! 补图二分图+dp记录路径codeforces 256A Almost Arithmetical Progression dp或暴力 dp[i][j] = d ...
- 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 ...
- 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 ...
随机推荐
- js在本地预览图片
移动web <body> <form enctype="multipart/form-data" name="form1"> 上传文件: ...
- 如何解决PHP中文乱码问题
如何解决PHP中文乱码问题 一.解决HTML中中文乱码问题方法 1.在head标签里面加入UTF8编码(国际化编码):UTF-8是没有国家的编码,也就是独立于任何一种语言,任何语言都可以使用的. ...
- 缓存 Cache
Controllers层 public class HomeController : Controller { // // GET: /Home/ // ...
- 【web安全】第三弹:web攻防平台pentester安装及XSS部分答案解析
web for pentester是国外安全研究者开发的的一款渗透测试平台,通过该平台你可以了解到常见的Web漏洞检测技术. 下载链接及文档说明: http://pentesterlab.com/ex ...
- JavaMail 发送邮件
JavaMail邮件发送 引用maven jar包 <dependency> <groupId>javax.mail</groupId> <artifactI ...
- CSAPP(深入理解计算机系统)读后感
9月到10月8号,包括国庆七天,大概每天5小时以上的时间,把Computer System: A Programmer Perspective 2rd version(深入理解计算机系统)的英文版啃完 ...
- jQuery获取屏幕的宽度
Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...
- 深入解析java虚拟机-jvm运行机制
转自oschina 一:JVM基础概念 JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现.编译虚拟机的指令集与编译微处理器的指令集非常类似.Java虚拟机包括一套字 ...
- MFC程序的启动过程——先全局对象theApp(第一入口),后WinMain(真正入口),会引爆pApp->InitInstance从而创建窗口(程序员入口)
原文出自:http://blog.csdn.net/yuvmen/article/details/5877271 了解MFC程序的启动过程,对于初学者来讲,了学习MFC很有帮助:对于不常用VC的人来说 ...
- Jquery 获取表单值如input,select等方法
1 if($("input[name=item][value='val']").attr('checked')==true) //判断是否已经打勾 name即控件name属性,va ...