[Swust OJ 412]--医院设置(floyd算法)
题目链接:http://acm.swust.edu.cn/problem/412/
Time limit(ms): 1000 Memory limit(kb): 65535
Description
设有一棵二叉树,如图:
![](https://images0.cnblogs.com/blog2015/687925/201506/261600517529128.gif)
![]()
![]()
其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相信接点之间的距离为1。如上图中,若医院建在:
1处,则距离和=4+12+2*20+2*40=136
3处,则距离和=4*2+13+20+40=81
……
![](https://images0.cnblogs.com/blog2015/687925/201506/261600517529128.gif)
其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相信接点之间的距离为1。如上图中,若医院建在:
1处,则距离和=4+12+2*20+2*40=136
3处,则距离和=4*2+13+20+40=81
……
Input
第一行一个整数n,表示树的结点数。(n≤100)
接下来的n行每行描述了一个结点的状况,包含三个整数,整数之间用空格(一个或多个)分隔,其中:第一个数为居民人口数;第二个数为左链接,为0表示无链接;第三个数为右链接。
接下来的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开始的(被坑了)~~~
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
如果这是你所爱的,就不要让自己后悔~~~