信息学奥赛一本通(C++)在线评测系统——基础(三)数据结构—— 1338:【例3-3】医院设置
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通(C++)在线评测系统——基础(三)数据结构—— 1338:【例3-3】医院设置
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 1018 通過數: 719
【題目描述】
設有一棵二叉樹(如圖3-8,其中圈中的數字表示結點中居民的人口,圈邊上數字表示結點編號。現在要求在某個結點上建立一個醫院,使所有居民所走的路程之和為最小,同時約定,相鄰結點之間的距離為1。就本圖而言,若醫院建在1處,則距離和=4+12+220+240=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
【來源】
No
算法分析
這是一道簡單的二叉樹應用問題,問題中的節點數并不多,數據規模也不大,采用鄰接矩陣存儲,用Floyed求出任意兩節點之間的最短路徑,然后窮舉醫院可能建立的n個節點位置找出一個最小距離的位置即可。
當然也可以用雙鏈表結構或帶父節點信息的數組存儲結構來解決,但實際操作稍微麻煩了一點。
代碼
#include <iostream> #include <cstdlib> #include <cstdio> using namespace std; int a[101]; int g[101][101]; int main () {int n,i,j,k,l,r,min,total;cin>>n;for(i=1;i<=n;i++){for(j=1;j<=n;j++){g[i][j]=1000000;}}for(i=1;i<=n;i++){g[i][j]=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(k=1;k<=n;k++){for(i=1;i<=n;i++){if(i!=k){for(j=1;j<=n;j++){if(i!=j&&k!=j&&g[i][k]+g[k][j]<g[i][j]){g[i][j]=g[i][k]+g[k][j];}}}}}min=0x7fffffff;for(i=1;i<=n;i++){total=0;for(j=1;j<=n;j++){total+=g[i][j]*a[i];}if(total<min) min=total;}cout<<min<<endl;return 0; }總結
以上是生活随笔為你收集整理的信息学奥赛一本通(C++)在线评测系统——基础(三)数据结构—— 1338:【例3-3】医院设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1337:【例3-2】单词查找树
- 下一篇: 信息学奥赛一本通(C++)在线评测系统—