[ZJOI2007]时态同步

因为修改的地方越靠上,影响的节点就越多。
O(n)求出从叶到每个节点的最长时间,对每个子树同步即可。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=500005;
int n,s,head[N],ecnt,dis[N];
long long ans;
struct Edge {
	int to,nxt,val;
} e[N<<1];
void add(int bg,int ed,int val) {
	e[++ecnt].nxt=head[bg],e[ecnt].to=ed,e[ecnt].val=val,head[bg]=ecnt;
}
int maxl;
void dfs(int x,int fa) {
	if(!head[x]) maxl=max(maxl,dis[x]);
	for(int i=head[x]; i; i=e[i].nxt) {
		int v=e[i].to;
		if(v==fa) continue;
		dfs(v,x);
		dis[x]=max(dis[x],dis[v]+e[i].val);
	}
}
void dfs1(int x,int fa) {
	for(int i=head[x]; i; i=e[i].nxt) {
		int v=e[i].to;
		if(v==fa) continue;
		dfs1(v,x);
		ans+=dis[x]-dis[v]-e[i].val;
	}
}
int main() {
	scanf("%d%d",&n,&s);
	for(int i=1,a,b,v; i<n; i++) {
		scanf("%d%d%d",&a,&b,&v);
	        add(b,a,v);
		add(a,b,v);
	}
	dfs(s,0);
	dfs1(s,0);
	cout<<ans;
}
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9331072.html