比赛 HAOI2009 模拟试题3 评测结果 AAAAA
题目名称 医院设置 最终得分 100
用户昵称 zqzas 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2009-04-23 11:22:53
显示代码纯文本
#include <iostream>

using namespace std;

#define MAXN 111

struct Node{
	long long pop;
	int id,right,left,father;
};

int n,dis[MAXN][MAXN];
long long ans;
bool vis[MAXN];
struct Node node[MAXN];

void dfs(int x,int src,int now)
{
	int L=node[x].left,R=node[x].right,F=node[x].father;
	vis[x]=true;
	dis[src][x]=now;
	if (L!=0 && !vis[L])
		dfs(L,src,now+1);
	if (R!=0 && !vis[R])
		dfs(R,src,now+1);
	if (F!=0 && !vis[F])
		dfs(F,src,now+1);
}

void run()
{
	int i,j;
	long long now;
	//getDistance
	for (i=1;i<=n;i++)
	{
		memset(vis,0,sizeof(vis));
		dfs(i,i,0);
	}
	ans=-1;
	for (i=1;i<=n;i++)//Hospital
	{
		now=0;
		for (j=1;j<=n;j++)
			now+=node[j].pop*dis[j][i];
		if (now<ans || ans==-1)
			ans=now;
	}
}

void ini()
{
	int i;
	scanf("%d",&n);
	for (i=1;i<=n;i++)
	{
		scanf("%d%d%d",&node[i].pop,&node[i].left,&node[i].right);
		node[node[i].left].father=node[node[i].right].father=i;
	}
}

int main()
{
	freopen("hospital.in","r",stdin);
	freopen("hospital.out","w",stdout);
	ini();
	run();
	cout<<ans;
	return 0;
}