(ssl1614)P1364 医院设置

时间:2023-01-01 17:17:14

医院设置

Time Limit:10000MS  Memory Limit:65536K
Total Submit:107 Accepted:81 
Case Time Limit:1000MS

Description

  设有一棵二叉树(如右图)。其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为1。如 右图中,若医院建在: 
  1处,则距离和=4+12+2*20+2*40=136 
  3处,则距离和=4*2+13+20+40=81 
    …………. 
(ssl1614)P1364 医院设置

Input

第一行一个整数n,表示树的结点数。(n<=100) 
接下来的n行每行描述了一个结点的状况,包含三个整数,整数之间用空格(一个或多个)分隔,其中:第一个数为居民人口数;第二个数为左链接,为0表示无链接;第三个数为右链接。   

Output

一个整数,表示最小距离和。

Sample Input

 5 
13 2 3 
4 0 0 
12 4 5 
20 0 0 
40 0 0 

Sample Output

81 

Source

elba

var
 a:array[0..1000,0..1000]of longint;
 p:array[0..1000]of longint;//人口数(pepole)
 n,l,r,i,j,k,min,ans:longint;
begin
 read(n);
 for i:=1 to n do
  for j:=1 to n do
   a[i,j]:=2333333;//赋大值~
 for i:=1 to n do
  begin
   readln(p[i],l,r);
   if l<>0 then begin//如果左边连通
                 a[l,i]:=1;//距离为1
                 a[i,l]:=1;//无向图
                end;
   if r<>0 then begin//如果右边连通
                 a[r,i]:=1;
                 a[i,r]:=1;
                end;
   end;
 for i:=1 to n do//Floyd...
  for j:=1 to n do
   for k:=1 to n do
    if a[j,i]+a[i,k]<a[j,k] then a[j,k]:=a[j,i]+a[i,k];
 ans:=maxlongint;
 for i:=1 to n do
  begin
   min:=0;
   for j:=1 to n do
    if i<>j then min:=min+a[i,j]*p[j];//不能重复,总路程=段数(循环做了)*路程(1)*人数
   if min<ans then ans:=min;
  end;
 writeln(ans);
end.