85 MLE+TLE
查看原帖
85 MLE+TLE
737864
Masterwei楼主2023/1/27 22:54
#include<bits/stdc++.h>
#include<bits/extc++.h>
#define Mx 1000005
#define ll long long
using namespace std;
void read(ll &x){
  int f=1;x=0;char s=getchar();
  while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
  while(s>='0'&&s<='9')x=x*10+s-'0',s=getchar();
  x*=f;
}
unordered_map<int,int>f[Mx];
struct node{
	ll x,y,z;
}edge[Mx];
ll n,x,y,z,ans,l[Mx];
vector<ll>a[Mx];
inline ll dfs(ll fm,ll end){
	if(f[fm][end]!=0)return f[fm][end]-1;
	if(f[end][fm]!=0)return n-f[end][fm]-1;
	ll h=0;
	if(a[end].size()==1)return 0;
	for(int i=0;i<a[end].size();i++){
		if(a[end][i]!=fm){
			f[end][a[end][i]]=dfs(end,a[end][i])+1;
			h+=f[end][a[end][i]];
		}
	}
	return h;
}
int main(){
	read(n);
	for(int i=1;i<n;i++){
		ll x1,y1,z1;
		read(x1),read(y1),read(z1);
		a[x1].push_back(y1);
		a[y1].push_back(x1);
		edge[i].x=x1;
		edge[i].y=y1;
		edge[i].z=z1;
	}
	for(int i=1;i<n;i++){
		ll fs,es;
		if(f[edge[i].x][edge[i].y]!=0)fs=f[edge[i].x][edge[i].y];
		else if(f[edge[i].y][edge[i].x]!=0)fs=f[edge[i].y][edge[i].x];
		else f[edge[i].x][edge[i].y]=dfs(edge[i].x,edge[i].y)+1,fs=f[edge[i].x][edge[i].y];
		//f[edge[i].y][edge[i].x]=dfs(edge[i].y,edge[i].x)+1;
		es=n-fs;
		ll sss=abs(fs-es)*edge[i].z;
		ans+=sss;
	}
	printf("%lld",ans);
	return 0;
}

2023/1/27 22:54
加载中...