比赛 |
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;
}