博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu2986 [USACO10MAR]伟大的奶牛聚集 (树形DP)
阅读量:5101 次
发布时间:2019-06-13

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

有点权的重心,拆掉点dfs不就是了吗

//#include 
#include
#include
//#include
//#include
#define R(a,b,c) for(register int a = (b); a <= (c); ++ a)#define nR(a,b,c) for(register int a = (b); a >= (c); -- a)#define Max(a,b) ((a) > (b) ? (a) : (b))#define Min(a,b) ((a) < (b) ? (a) : (b))#define Fill(a,b) memset(a, b, sizeof(a))#define Abs(a) ((a) < 0 ? -(a) : (a))#define Swap(a,b) a^=b^=a^=b#define ll long long#define ON_DEBUG#ifdef ON_DEBUG#define D_e_Line printf("\n\n----------\n\n")#define D_e(x) cout << #x << " = " << x << endl#define Pause() system("pause")#define FileOpen() freopen("in.txt","r",stdin);#else#define D_e_Line ;#define D_e(x) ;#define Pause() ;#define FileOpen() ;#endifstruct ios{ template
ios& operator >> (ATP &x){ x = 0; int f = 1; char c; for(c = getchar(); c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1; while(c >= '0' && c <= '9') x = x * 10 + (c ^ '0'), c = getchar(); x*= f; return *this; }}io;using namespace std;const int N = 100007;struct Edge{ int nxt, pre, w;}e[N << 1];int head[N], cntEdge;inline void add(int u, int v, int w){ e[++cntEdge] = (Edge){ head[u], v, w}, head[u] = cntEdge;}int C[N], totSize;int siz[N];long long f[N];inline void DFS_1(int u, int fa){ siz[u] = C[u]; for(register int i = head[u]; i; i = e[i].nxt){ int v = e[i].pre; if(v == fa) continue; DFS_1(v, u); siz[u] += siz[v]; f[u] += f[v] + 1ll * siz[v] * e[i].w; }}long long ans = 9223372036854775807;inline void DFS_2(int u, int fa){ for(register int i = head[u]; i; i = e[i].nxt){ int v = e[i].pre; if(v == fa) continue; f[v] = f[u] - 1ll * siz[v] * e[i].w + 1ll * (totSize - siz[v]) * e[i].w; ans = Min(ans, f[v]); DFS_2(v, u); }}int main(){//FileOpen(); int n; io >> n; R(i,1,n){ io >> C[i]; totSize += C[i]; } R(i,2,n){ int u, v, w; io >> u >> v >> w; add(u, v, w); add(v, u, w); } // DFS_First(1, 0);// DFS_Second(1, 1);// // long long ans = 9223372036854775807;// R(i,1,n){// long long sum = 0;// R(j,1,n){// if(i == j) continue;// sum += 1ll * (dis[i] - (dis[LCA(i, j)] << 1) + dis[j]) * C[j];// }// ans = Min(ans, sum);// } DFS_1(1, 0); for(register int i = 2; i <= n; i += 3) f[i] = f[i + 1] = f[i + 2] = 0; DFS_2(1, 0); printf("%lld", ans); return 0;}

1570282-20190726191917695-1847521511.png

转载于:https://www.cnblogs.com/bingoyes/p/11252317.html

你可能感兴趣的文章
来来,一起设计一个简单的活动发布系统
查看>>
页面加载速度优化的建议
查看>>
pandas(python2) 读取中文数据,处理中文列名
查看>>
技术文章-Java类的继承
查看>>
汇编实验三
查看>>
Android中的Intent详细讲解【转】
查看>>
浅谈javascript和java中的字符串
查看>>
ASP.NET WebAPI构建API接口服务实战演练
查看>>
Auth 认证模块
查看>>
【实例】原生 js 实现全屏滚动效果
查看>>
atitit.java解析sql语言解析器解释器的实现
查看>>
Ubuntu18.04安装
查看>>
struts2文件下载及文件名中文问题
查看>>
使用原生Java代码生成可执行Jar包
查看>>
<轉>APUE:mmap函数
查看>>
网站结构优化
查看>>
IFrame与window对象(contentWindow)
查看>>
19、Flask实战第19天:CSRF攻击与防御
查看>>
Shell Notes(2)
查看>>
ArcGIS Engine开发前基础知识(3)
查看>>