2577 医院设置

2577 医院设置

 

 时间限制: 1 s
 空间限制: 32000 KB
 题目等级 : 黄金 Gold 
 
题目描述 Description

设有一棵二叉树,如下图

其中,圈中数字表示结点居民的人口.圈边上数字表示结点编号,.现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻结点之间 的距离为1.如上图中,若医院建在:

1处:则距离之和=4+12+2*20+2*40=136

3处:则距离之和=4*2+13+20+40=81

输入描述 Input Description

第一行一个整数n,表示树的结点数。(n<=100)

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

输出描述 Output Description

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

样例输入 Sample Input

5

13 2 3

4 0 0

12 4 5

20 0 0

40 0 0

样例输出 Sample Output

81

数据范围及提示 Data Size & Hint

思路:spfa+暴力

 1 #include<cstdio>
 2 #include<cstring>
 3 
 4 int map[101][101];
 5 int peo[101];
 6 int dis[101];
 7 int team[101],head,tail;
 8 bool vis[101];
 9 int n,sum,ans,minn=9999999;
10 void juli(int a)
11 {
12     memset(dis,127,sizeof(dis));
13     memset(vis,0,sizeof(vis));
14     memset(team,0,sizeof(team));
15     tail=0;
16     head=0;
17     dis[a]=0;
18     vis[a]=1;
19     team[tail++]=a;
20     while(head<tail)
21     {
22         int d=team[head];
23         head++;
24         for(int i=1;i<=n;++i)
25         {
26             if(map[d][i]&&dis[i]>dis[d]+map[d][i])
27             {
28                 dis[i]=map[d][i]+dis[d];
29                 if(!vis[i])
30                 {
31                     team[tail++]=i;
32                     vis[i]=1;
33                 }
34             }
35         }
36         vis[d]=0;
37     }
38     for(int i=1;i<=n;++i)
39     {
40         sum+=peo[i]*dis[i];
41     }
42 }
43 int main()
44 {
45     scanf("%d",&n);
46     for(int i=1;i<=n;++i)
47     {
48         int a,b,c;
49         scanf("%d%d%d",&c,&a,&b);
50         if(a)
51         {
52             map[i][a]=1;
53             map[a][i]=1;
54         }    
55         if(b)
56         {
57             map[b][i]=1;
58             map[i][b]=1;
59         }
60         peo[i]=c;
61     }
62     for(int i=1;i<=n;++i)
63     {
64         sum=0;
65         juli(i);
66         if(sum<minn)
67         {
68             minn=sum;
69         }
70     }
71     printf("%d",minn);
72     return 0;
73 }
原文地址:https://www.cnblogs.com/mjtcn/p/6744276.html