[Swust OJ 412]--医院设置(floyd算法)

题目链接:http://acm.swust.edu.cn/problem/412/

Time limit(ms): 1000        Memory limit(kb): 65535
 
Description
设有一棵二叉树,如图: 



其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相信接点之间的距离为1。如上图中,若医院建在: 
1处,则距离和=4+12+2*20+2*40=136 
3处,则距离和=4*2+13+20+40=81 
……
 
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
 


解题思路:传说中只有5行的floyd算法(链接)带进去瞎搞就可以了·--,恩~~看题中的样例数据,下标从1开始的(被坑了)~~~
 
代码如下:
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 #define inf 0x3f3f3f
 6 
 7 int n, ptr[101], mpt[101][101], L, R;
 8 void Floyd(){
 9     for (int k = 1; k <= n; k++){
10         for (int i = 1; i <= n; i++){
11             for (int j = 1; j <= n; j++)
12                 mpt[i][j] = min(mpt[i][j], mpt[i][k] + mpt[k][j]);
13         }
14     }
15 }
16 int main(){
17     int i, j, sum, tmp;
18     while (cin >> n){
19         sum = inf;
20         memset(mpt, inf, sizeof(mpt));
21         for (i = 1; i <= n; i++){
22             cin >> ptr[i] >> L >> R;
23             mpt[L][i] = mpt[i][L] = mpt[R][i] = mpt[i][R] = 1;
24         }
25         Floyd();
26         for (i = 1; i <= n; i++){
27             tmp = 0;
28             for (j = 1; j <= n; j++) {
29                 if (i != j)
30                     tmp += mpt[i][j] * ptr[j];
31             }
32             sum = min(sum, tmp);
33         }
34         cout << sum << endl;
35     }
36     return 0;
37 }
View Code
原文地址:https://www.cnblogs.com/zyxStar/p/4602512.html