bzoj1060 [ZJOI2007]时态同步
2017-09-09 16:17
197 查看
题目
树上做递推
每个节点对答案的贡献为f[x]-f[to[i]]-val[i],val为边权,f[x]为节点到其叶子节点最长的路径长度。
树上做递推
每个节点对答案的贡献为f[x]-f[to[i]]-val[i],val为边权,f[x]为节点到其叶子节点最长的路径长度。
#include<bits/stdc++.h> #define N 500000 using namespace std; int n,rt,x,y,z; int first[N+1],nex[2*N+1],to[2*N+1],val[2*N+1],siz; long long f[N+1],ans; int read() { int x=0; char c=getchar(); while(c<'0'||c>'9')c=getchar(); while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar(); return x; } void add(int x,int y,int z) { nex[siz]=first[x]; first[x]=siz; to[siz]=y; val[siz]=z; siz++; } void DFS(int x,int fa) { f[x]=0; for(int i=first[x];i!=-1;i=nex[i]) { int u=to[i]; if(u==fa)continue; DFS(u,x); f[x]=max(f[x],f[u]+val[i]); } for(int i=first[x];i!=-1;i=nex[i]) if(to[i]!=fa)ans+=f[x]-f[to[i]]-val[i]; } int main() { //freopen("in.txt","r",stdin); memset(first,-1,sizeof(first)); n=read(),rt=read(); for(int i=1;i<n;i++) { x=read(),y=read(),z=read(); add(x,y,z),add(y,x,z); } DFS(rt,0); cout<<ans; return 0; }
相关文章推荐
- BZOJ1060: [ZJOI2007]时态同步(洛谷P1131)
- BZOJ1060:[ZJOI2007]时态同步——题解
- BZOJ 1060: [ZJOI2007]时态同步 树形DP
- 【BZOJ1060】【ZJOI2007】时态同步
- 【洛谷1131】【ZJOI2007】时态同步
- [ZJOI2007]时态同步
- 洛谷 P1131 [ZJOI2007]时态同步
- 洛谷P1131 [ZJOI2007]时态同步
- 【洛谷1131】【ZJOI2007】时态同步
- [ZJOI2007]BZOJ1060时态同步-贪心
- P1131 [ZJOI2007]时态同步
- 【BZOJ1060】[ZJOI2007]时态同步
- [ZJOI2007] 时态同步
- bzoj 1060 [ZJOI2007]时态同步(树形DP)
- [BZOJ 1060][ZJOI2007]时态同步
- bzoj1060 [ZJOI2007]时态同步
- BZOJ 1060 ZJOI2007 时态同步 树形DP
- BZOJ1060[ZJOI2007]时态同步
- LuoguP1131[ZJOI2007] 时态同步 解题报告【树形DP(?)】
- [ZJOI2007]棋盘制作 报表统计 矩阵游戏 时态同步