某地區經過對城鎮交通狀況的調查,得到現有城鎮間快速道路的統計資料,並提出「暢通工程」的目標:使整個地區任何兩個城鎮間都可以實現快速交通(但不一定有直接的快速道路相連,只要互相間接通過快速路可達即可)。現得到城鎮道路統計表,表中列出了任意兩城鎮間修建快速路的費用,以及該道路是否已經修通的狀態。現請你編寫程式,計算出全地區暢通需要的最低成本。
輸入格式:
輸入的第一行給出村莊數目n (1≤n≤100);隨後的n(n−1)/2行對應村莊間道路的成本及修建狀態:每行給出4個正整數,分別是兩個村莊的編號(從1編號到n),此兩村莊間道路的成本,以及修建狀態 — 1表示已建,0表示未建。
輸出格式:
輸出全省暢通需要的最低成本。
輸入樣例:
1 2 1 1
1 3 4 0
1 4 1 1
2 3 3 0
2 4 2 1
3 4 5 0
輸出樣例:
(1)分析
由於是稠密圖,所以採用prim演算法。二維陣列陣列儲存圖,陣列儲存路費,visit記錄該點是否已經加入最小生成樹中。首先以第乙個結點作為最小生成樹的初始結點,然後找出與最小生成樹中各結點權重最小邊,且該結點不在最小生成樹中(確保無環路),然後加入到最小生成樹中,更新沒有在最小生成樹中的結點和最小生成樹中各結點權重邊。迴圈上述步驟直到生成最小生成樹,過程中最小生成樹中各結點權重最小邊的權重和就是最低成本。
時間複雜度:o(n²)
(2)**及執行
#include
using namespace std;
int main(
);//表示該點是否已經加入最小生成樹中
int n,i,j;
cin>>n;
memset(value,1,sizeof(value))
; int m=n*(n-1)/2;
for(i=1; i<=m; i++)
else
} for(i=1; i<=n; i++)
int start=1;
visit[start]
=1; for(i=1; i<=n; i++)//初始化
int num=0;
for(i=1; i<=n-1; i++)//最多n-1條路
} if(minval==99999)break;
num+=minval;
visit[start]
=1; for(j=1; j<=n; j++)}}
cout
}
1000 合併石頭的最低成本
有n堆石頭排成一排,第i堆中有stones i 塊石頭。每次移動 move 需要將連續的k堆石頭合併為一堆,而這個移動的成本為這k堆石頭的總數。找出把所有石頭合併成一堆的最低成本。如果不可能,返回 1。示例 1 輸入 stones 3,2,4,1 k 2 輸出 20 解釋 從 3,2,4,1 開始。...
暢通工程之最低成本建設問題(30 分)
這個題目就是乙個最小生成樹,如果無法構成就輸出impossible 就是構成最小生成樹的時候,每選擇一條邊然後加加,最後統計是否有n 1條就可以。最小生成樹的講解在我的其他的部落格中有提到 include include include include include include include...
5 4 暢通工程之最低成本建設問題 30分
5 4 暢通工程之最低成本建設問題 30分 某地區經過對城鎮交通狀況的調查,得到現有城鎮間快速道路的統計資料,並提出 暢通工程 的目標 使整個地區任何兩個城鎮間都可以實現快速交通 但不一定有直接的快速道路相連,只要互相間接通過快速路可達即可 現得到城鎮道路統計表,表中列出了有可能建設成快速路的若干條...