玄学RE 70
查看原帖
玄学RE 70
182533
Akwamaryna楼主2020/4/28 08:44
#include<cmath>
#include<iostream>
using namespace std;
long long n,ans=0,num[100010];
struct EDGE
{
	int pre;
	int dis;
	int to;
}edge[200010];
int edge_sum,head[100010];
void add_edge(int from,int dis,int to)
{
	edge_sum++;
	edge[edge_sum].pre=head[from];
	edge[edge_sum].dis=dis;
	edge[edge_sum].to=to;
	head[from]=edge_sum;
}
void dfs(int u,int f)
{
	num[u]=1;
	//cout<<u<<" ";
	for(int i=head[u];i!=0;i=edge[i].pre)
		if(edge[i].to!=f)
		{
			int v=edge[i].to;
			dfs(edge[i].to,u);
			ans=ans+abs(2*num[v]-n)*edge[i].dis;
			num[u]=num[u]+num[v];
		}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n-1;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		add_edge(u,w,v);
		add_edge(v,w,u);
	}
	/*for(int i=1;i<=n;i++)
	{
		cout<<"head["<<i<<"]";
		for(int j=head[i];j!=0;j=edge[j].pre)
			cout<<"->"<<edge[j].to;
		cout<<endl;
	}*/
	dfs(1,1);
	//for(int i=1;i<=n;i++)cout<<num[i]<<" ";
	cout<<ans<<endl;
	return 0;
}
2020/4/28 08:44
加载中...