題目描述 description
乙個國家有n個城市。若干個城市之間有**線連線,現在要增加m條**線(**線當然是雙向的了),使得任意兩個城市之間都直接或間接經過其他城市有**線連線,你的程式應該能夠找出最小費用及其一種連線方案。
輸入描述 input description
輸入檔案的第一行是n的值(n<=100).
第二行至第n+1行是乙個n*n的矩陣,第i行第j列的數如果為0表示城市i與城市j有**線連線,否則為這兩個城市之間的連線費用(範圍不超過10000)。
輸出描述 output description
輸出檔案的第一行為你連線的**線總數m,第二行至第m+1行為你連線的每條**線,格式為i j,(i第m+2行是連線這些**線的總費用。
樣例輸入 sample input
0 15 27 6 0
15 0 33 19 11
27 33 0 0 17
6 19 0 0 9
0 11 17 9 0
樣例輸出 sample output
1 42 5
資料範圍及提示 data size & hint
n<=100
思想:基本的做法和之前寫過的普里姆演算法求最小生成樹的一樣,下面寫的題解是在那基礎之上修改的。
可以戳這個鏈結先看一下
不同點,更新每個藍點到白點集團的最小距離時,更新它的father點fa[i]
#include#includeview codeusing
namespace
std;
intmain()
//找出當前距離白點集團最近的藍點
u[k]=0
; ans+=minn[k];
que[cnt]=k;//
把這個點存入輸出que裡
if(minn[k]!=0&&minn[k]!=0x7f) cnt++;//
如果當前加入que的點是本來沒有連上線的點,才算作新加入的點,cnt++
for(j=1;j<=n;j++)
if(u[j]&&e[k][j]}}
cout
for(i=0;i)
cout
<
return0;
}
最小生成樹(普里姆演算法)
關於什麼是prim 普里姆演算法 在實際生活中,我們常常碰到類似這種一類問題 如果要在n個城市之間建立通訊聯絡網,則連通n個城市僅僅須要n 1條線路。這時。我們須要考慮這樣乙個問題。怎樣在最節省經費前提 下建立這個通訊網.換句話說,我們須要在這n個城市中找出乙個包括全部城市的連通子圖,使得 其全部邊...
最小生成樹 普里姆演算法
普利姆演算法 最小生成樹 把所有頂點分為 2 個集合 乙個表示已經選中的頂點集合 另乙個表示未選中的頂點集合 例如 a,b,c,d,e 五個頂點 1.任意選擇乙個頂點 放在 已經選中的頂點集合中 假如 選a 2.將a 與未選中頂點集合中 選擇 一頂點 條件 權值最小的乙個頂點 如何權值相同 則任意選...
最小生成樹 普里姆演算法
當我們要求解n個連線城市之間的路線問題,就需要我們進行乙個計算。而在連通網上面,我們稱這類問題為最小代價生成樹 最小生成樹 問題。今天我們主要討論的是用普里姆演算法實現最小生成樹。如圖所示,a圖是乙個有權值的連通圖。要對其進行最小生成樹求解,假設初始點為v1,尋找與1有關係而且權值最小的頂點 圖源嚴...