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

 

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

 

Time limit(ms): 1000        Memory limit(kb): 65535
 
Description
设有一棵二叉树,如图: 
[Swust OJ 412]--医院设置(floyd算法)


其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相信接点之间的距离为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

 

你可能感兴趣的:(floyd)