現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。
輸入格式:
輸入資料報括城鎮數目正整數n(≤1000)和候選道路數目m(≤3n);隨後的m行對應m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。為簡單起見,城鎮從1到n編號。
輸出格式:
輸出村村通需要的最低成本。如果輸入資料不足以保證暢通,則輸出−1,表示需要建設更多公路。
思路:這道題是最小生成樹問題,這裡採用prim演算法
首先明確最小生成樹定義
我們把構造連通網的最小代價生成樹成為最小生成樹
要和最短路徑區分開來
最小生成樹能夠保證整個拓撲圖的所有路徑之和最小,但不能保證任意兩點之間是最短路徑。
最短路徑是從一點出發,到達目的地的路徑最小。
最小生成樹構成後所有的點都被連通,而最短路只要到達目的地走的是最短的路徑即可,與所有的點連不連通沒有關係。
再來介紹 prim 演算法
假設n=(v,)是連通網,te是n上最小生成樹中邊的集合,演算法從u=(u0∈ v),te={}開始。重複上述操作:在所有u∈ u,v∈ v-u的邊(u,v)∈ e中找一條代價最小的邊(u0,v0)併入集合te,同時v0併入u,直至u=v為止。此時te必有n-1條邊,則t=(v,)為n的最小生成樹
總體來說prim演算法類似於迪傑斯特拉演算法,從選定乙個根結點開始,使樹不斷長大,每次尋找離最小生成樹最近的路徑,將其收錄進來,並且將收錄頂點到生成樹的距離更改為0,即lowcost[k]=0,然後繼續迴圈尋找離最小生成樹最短的路徑
#include
#include
#define maxvex 1003
#define infinity 65535
void
creategraph()
;int
prim()
;int g[maxvex]
[maxvex]
,nv,ne;
intmain()
void
creategraph()
}for
( i=
0; i)//注意這裡是讀入邊
}int
prim()
for( i=
2; i<=nv; i++
) j++;}
if(k==0)
sum_cost +
= min;
lowcost[k]=0
;//將當前頂點設定為0,表示此結點已經完成任務
for( j=
2; j<=nv; j++)}
}return sum_cost;
}
7 10 公路村村通
通過的 以及注釋,注釋最多的地方,是思考的最多的地方 include include includeusing namespace std define n 1005 下次不要用n來命名,不然容易和下面的n弄混,unnecessarily int f n 樹的母節點,例如節點1的母節點f 1 2,那...
7 10 公路村村通
傳送門 題目描述 現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入格式 輸入資料報括城鎮數目正整數n 1000 和候選道路數目m 3n 隨後的m行對應m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道...
7 10 公路村村通
7 10 公路村村通 30 分 現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入資料報括城鎮數目正整數n 1000 和候選道路數目m 3n 隨後的m行對應m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及...