博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDOJ 3899 JLUCPC
阅读量:5308 次
发布时间:2019-06-14

本文共 1272 字,大约阅读时间需要 4 分钟。

题意:n个地点构成一棵树,第 i 个地点有 t_i 个人,现要选一个地点开会,求所有人行走距离之和的最小值。N<=10^5

分析:先任选一个地点,求出总代价,然后就能求出相邻点的代价,一遍dfs就能求出所有点的代价。

dfs会爆栈,需要开内存挂:#pragma comment(linker, "/STACK:1024000000,1024000000")

View Code
#include 
#include
#include
using namespace std;#define N 100001#pragma comment(linker, "/STACK:1024000000,1024000000")typedef __int64 LL;int n,t[N],e,sum;int first[N],next[N<<1],v[N<<1],w[N<<1];LL dp[N],tsum[N],ans[N];void init(){ e=sum=0; memset(first,-1,sizeof(first));}void add(int a,int b,int c){ v[e]=b; w[e]=c; next[e]=first[a]; first[a]=e++;}void DP(int a,int fa){ dp[a]=0; tsum[a]=t[a]; int i,b; for(i=first[a];~i;i=next[i]) { b=v[i]; if(b==fa) continue; DP(b,a); tsum[a]+=tsum[b]; dp[a]+=dp[b]+tsum[b]*w[i]; }}void dfs(int a,int fa,LL cost){ int i,b; for(i=first[a];~i;i=next[i]) { b=v[i]; if(b^fa) dfs(b,a,ans[b]=cost+(sum-2*tsum[b])*w[i]); }}int main(){ int a,b,c; while(~scanf("%d",&n)) { init(); for(int i=1;i<=n;i++) { scanf("%d",&t[i]); sum+=t[i]; } for(int i=1;i

转载于:https://www.cnblogs.com/algorithms/archive/2012/09/17/2689081.html

你可能感兴趣的文章
Web前端开发工程师的具备条件
查看>>
实用Android开发工具和资源精选
查看>>
TileMap
查看>>
JS属性大全
查看>>
java复制文件
查看>>
第一册:lesson seventy nine.
查看>>
GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
查看>>
团队作业
查看>>
数据持久化时的小bug
查看>>
mysql中key 、primary key 、unique key 与index区别
查看>>
bzoj2257
查看>>
Linux查看文件编码格式及文件编码转换<转>
查看>>
Leetcode: Find Leaves of Binary Tree
查看>>
Vue 模板解释
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>
将多张图片和文字合成一张图片
查看>>
自己动手写ORM(01):解析表达式树生成Sql碎片
查看>>
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
百度Ueditor编辑器的Html模式自动替换样式的解决方法
查看>>