第三部分 數據結構 --樹-1338:【例3-3】醫院設置

1338:【例3-3】醫院設置

時間限制: 1000 ms 內存限制: 65536 KB
【題目描述】
設有一棵二叉樹(如下圖),其中圈中的數字表示結點中居民的人口,圈邊上數字表示結點編號。現在要求在某個結點上建立一個醫院,使所有居民所走的路程之和爲最小,同時約定,相鄰結點之間的距離爲1。就本圖而言,若醫院建在1處,則距離和=4+12+2×20+2×40=136;若醫院建在3處,則距離和=4×2+13+20+40=81……

在這裏插入圖片描述

【輸入】
第一行一個整數n,表示樹的結點數(n≤100)。接下來的n行每行描述了一個結點的狀況,包含三個整數,整數之間用空格(一個或多個)分隔,其中:第一個數爲居民人口數;第二個數爲左鏈接,爲0表示無鏈接;第三個數爲右鏈接,爲0表示無鏈接。

【輸出】
一個整數,表示最小距離和。

【輸入樣例】
5
13 2 3
4 0 0
12 4 5
20 0 0
40 0 0
【輸出樣例】
81


思路:二叉樹應用問題,問題中的節點數並不多,數據規模也不大,採用鄰接矩陣存儲,用Floyed求出任意兩節點之間的最短路徑,然後窮舉醫院可能建立的n個節點位置找出一個最小距離的位置即可。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=0x3f3f3f3f;
int a[101];
int g[101][101];
int main()
{
    int n;
    cin >> n;
    int l,r;
    for(int i = 1;i <= n;i++)
        for(int j = 1;j <= n;j++)
        g[i][j] = maxn;
    for(int i = 1;i <= n;i++)
    {
        g[i][i] = 0;
        cin >> a[i] >> l >> r;
        if(l > 0) g[i][l] = g[l][i] = 1;
        if(r > 0) g[i][r] = g[r][i] = 1;
    }
    for(int k = 1;k <= n;k++)//Floyed求出任意兩節點之間的最短路徑核心代碼三層循環
        for(int i = 1;i <= n;i++)
        for(int j = 1;j <= n;j++)
        {
            g[i][j] = min(g[i][j],g[i][k] + g[k][j]);
        }
    int minn = maxn;
    int sum = 0;
    for(int i = 1;i <= n;i++)
    {
        sum = 0;
        for(int j = 1;j <= n;j++)
        {
            sum += g[i][j] * a[j];
 
        }
        if(sum < minn)
            minn = sum;
 
    }
    cout << minn << endl;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章