站外题求调
  • 板块学术版
  • 楼主HYJ37567
  • 当前回复2
  • 已保存回复3
  • 发布时间2024/12/7 14:23
  • 上次更新2024/12/7 16:56:59
查看原帖
站外题求调
665533
HYJ37567楼主2024/12/7 14:23

rt

Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会。

当然,她会选择最方便的地点来举办这次集会。

每个奶牛居住在 N(1<=N<=100,000) 个农场中的一个,这些农场由N-1条道路连接,并且从任意一个农场都能够到达另外一个农场。

道路i连接农场A_i和B_i(1 <= A_i <=N; 1 <= B_i <= N),长度为L_i(1 <= L_i <= 1,000)。

集会可以在N个农场中的任意一个举行。另外,每个牛棚中居住者C_i(0 <= C_i <= 1,000)只奶牛。

在选择集会的地点的时候,Bessie希望最大化方便的程度(也就是最小化不方便程度)。

比如选择第X个农场作为集会地点,它的不方便程度是其它牛棚中每只奶牛去参加集会所走的路程之和,(比如,农场i到达农场X的距离是20,那么总路程就是C_i*20)。

帮助Bessie找出最方便的地点来举行大集会。 考虑一个由五个农场组成的国家,分别由长度各异的道路连接起来。在所有农场中,3号和4号没有奶牛居住。

输入格式

第一行:一个整数N

第二到N+1行:第i+1行有一个整数C_i

第N+2行到2*N行,第i+N+1行为3个整数:A_i,B_i和L_i。

输出格式

  • 第一行:一个值,表示最小的不方便值。

输入/输出例子1 输入:

5 1 1 0 0 2 1 3 1 2 3 2 3 4 3 4 5 3

输出:

15

#include<bits/stdc++.h>
using namespace std;
struct st
{
	int ne,le;
};
vector<st> e[100005];
int n,c[100005],a[100005],b[100005],l[100005],sum;
int tot;
int f[100005],size[100005];
void dfs1(int now,int father,int deep)
{
	sum+=deep*c[now];
	size[now]=c[now];
	for(auto E:e[now])
	{
		int son=E.ne;
		if(son==father) continue;
		dfs1(son,now,deep+E.le);
		size[now]+=size[son];
	}
}
void dfs2(int now,int father)
{
	if(e[now].size()<=1&&now!=1) return ;
	for(auto E:e[now])
	{
		int son=E.ne,len=E.le;
		if(son==father) continue;
		f[son]=f[now]+tot*len-2*size[son]*len;
		dfs2(son,now);
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&c[i]);
		tot+=c[i];
	}
	for(int i=1;i<n;i++)
	{
		scanf("%d%d%d",&a[i],&b[i],&l[i]);
		e[a[i]].push_back((st){b[i],l[i]});
		e[b[i]].push_back((st){a[i],l[i]});
	}
	dfs1(1,-1,0);
	f[1]=sum;
	dfs2(1,-1);
	int ans=sum;
	for(int i=1;i<=n;i++)
	{
		ans=min(ans,f[i]);
	}
	printf("%d\n",ans);
	return 0;
}
2024/12/7 14:23
加载中...