纪中暑假集训 2020.08.11【NOIP提高组】模拟 T4:景点中心

景点中心

Description

话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观。镇海中学共有n个景点,每个景点均有若干学生正在参观。这n个景点以自然数1至n编号,每两个景点的编号均不同。每两个景点之间有且只有一条路径。选择哪个景点集中的学生,才能使所有学生走过的路径之和最小呢?
如果存在多个解,则输出距离1最近的那个点,可以证明答案唯一

Input

输入文件center.in中有若干行:
第一行只有一个正整数n,表示景点数。
第二行有n个1至1000间的整数,这n个整数间互相以一个空格分隔。其中第i个整数表示第i个景点处的学生数。
第三行至第n+1行,每行有三个整数I,j,k,表示景点i和景点j之间有一条长尾k的路径直接连接。其中i<>j,1≤i≤n,1≤j≤n;1≤k≤1000。

Output

输出文件center.out中有二行;
第一行只有一个整数i,表示在第i个景点处集中时,所有学生走过的路径之和最短。
第二行也只有一个整数,表示所有学生走过的路径之和的最小值。

Sample Input

4
3 2 4 1
1 2 5
3 1 6
2 4 4

Sample Output

1
43

Hint

在这里插入图片描述
【数据限制】
所有的数据均随机生成,且满足:
30%的数据,1≤n≤200。
60%的数据,1≤n≤3000。
100%的数据,1≤n≤100000。

反思&题解

比赛思路: 这不很明显是个树形DP吗?只不过式子推错了,调了很久没过样例于是直接暴力水60分
**正解思路:**以1号节点为根节点,设 f [ i ] f[i] 表示所有人到这个节点的路径长度最小值,一次dfs可以求出 f [ 1 ] f[1] ,之后设 a [ i ] a[i] 表示以i为根的子树总共有多少个人,第一次dfs也可以求出,我们考虑怎么求其他的 f [ i ] f[i]
假设当前节点为now,他的儿子节点为v,如果在v这个节点集中,那么以v为根的子树的所有人的路程就缩短了now到v的路程,其它的人都增加了now到v的路程,方程便很显然了: f [ v ] = f [ n o w ] + n o w v ( a [ 1 ] 2 a [ v ] ) f[v]=f[now]+now到v的距离*(a[1]-2*a[v])
反思: 对于DP的感觉还是要多练练

CODE

#include<bits/stdc++.h>
using namespace std;
struct arr
{
	long long to,next,w;
}edge[200005];
long long a[100005],head[200005],f[200005],ans1,ans2,n,cnt;
void dfs(int now,int fa)
{
	int i;
	for (i=head[now];i;i=edge[i].next)
	{
		int v=edge[i].to;
		if (v!=fa)
		{
			dfs(v,now);
			a[now]+=a[v];
			f[now]+=f[v]+a[v]*edge[i].w;
		}
	}
}
void dp(int now,int fa)
{
	int i;
	for (i=head[now];i;i=edge[i].next)
	{
		int v=edge[i].to;
		if (v!=fa)
		{
			f[v]=f[now]+edge[i].w*(a[1]-2*a[v]);
			dp(v,now);
		}
	}
}
void add(long long u,long long v,long long len)
{
	edge[++cnt].w=len;
	edge[cnt].to=v;
	edge[cnt].next=head[u];
	head[u]=cnt;
}
int main()
{
	scanf("%lld",&n);
	int i;
	for (i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for (i=1;i<n;i++)
	{
		long long x,y,z;
		scanf("%lld%lld%lld",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	dfs(1,0);
	dp(1,0);
	ans2=1e15;
	for (i=1;i<=n;i++)
	{
		if (f[i]<ans2)
		{
			ans2=f[i];
			ans1=i;
		}
	}
	printf("%lld\n%lld\n",ans1,ans2);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/CMC_YXY/article/details/107943171