25分,求大佬
查看原帖
25分,求大佬
544446
Demon_master楼主2022/1/3 09:08
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=200000*2+12;
ll n;
struct E{
	ll f,t,n,v1,v2;
}edge[maxn];
ll l,head[maxn];

//dfs
ll dep[maxn],f[maxn][30];
void dfs(ll num,ll fa){
	dep[num]=dep[fa]+1;
	for(ll i=1;(1<<i)<=n;i++){
		f[num][i]=f[f[num][i-1]][i-1];
	}
	for(ll i=head[num];i;i=edge[i].n){
		ll t=edge[i].t;
		if(t==fa) continue;
		f[t][0]=num;
		dfs(t,num);
	}
}
//end

//lca
ll get_lca(ll id_1,ll id_2){
	if(dep[id_2]<dep[id_1]) swap(id_1,id_2);
	ll l=dep[id_2]-dep[id_1],k=0;
	while(l){
		if(l&1) id_2=f[id_2][k];
		k++,l=l>>1;
	}
	if(id_2==id_1) return id_1;
	for(ll i=35;i>=0;i--){
		if(f[id_1][i]!=f[id_2][i]){
			id_1=f[id_1][i];
			id_2=f[id_2][i];
		}
	}
	return f[id_1][0];
}
//end

ll js[maxn],ans=0;

void dfs_2(ll num){
	for(ll i=head[num];i;i=edge[i].n){
		ll t=edge[i].t;
		if(t==f[num][0]) continue;
		dfs_2(t);
		js[num]+=js[t];
		if(edge[i].v1*js[t]>=edge[i].v2) ans+=edge[i].v2;
		else ans+=edge[i].v1*js[t];
	}
}

inline void read(){
	scanf("%lld",&n);
	for(ll i=1;i<n;i++){
		ll f,t,v1,v2;
		scanf("%lld%lld%lld%lld",&f,&t,&v1,&v2);
		l++,edge[l]=(E){f,t,head[f],v1,v2},head[f]=l;
		l++,edge[l]=(E){t,f,head[t],v1,v2},head[t]=l;
	}
	dep[1]=1;
	dfs(1,0);
//	cout<<2;
	for(ll i=1;i<n;i++){
		ll a=get_lca(i,i+1);
//		cout<<4;
		js[i]++,js[i+1]++;
		js[a]-=2;
	}
//	cout<<3;
	dfs_2(1);
	printf("%lld",ans);
}

int main (){
	read();
}

2022/1/3 09:08
加载中...