暢通工程 最小生成樹)(最短路徑和)

2022-08-17 16:42:18 字數 1729 閱讀 2196

problem description

省**「暢通工程」的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可)。經過調查評估,得到的統計表中列出了有可能建設公路的若干條道路的成本。現請你編寫程式,計算出全省暢通需要的最低成本。

input

測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 n、村莊數目m ( < 100 );隨後的 n

行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本(也是正整數)。為簡單起見,村莊從1到m編號。當n為0時,全部輸入結束,相應的結果不要輸出。

output

對每個測試用例,在1行裡輸出全省暢通需要的最低成本。若統計資料不足以保證暢通,則輸出「?」。

sample input

3 3

1 2 1

1 3 2

2 3 4

1 32 3 2

0 100

sample output

3

?

分析:prim演算法 (迪傑斯特拉+記錄任意兩點最短路徑和)

坑點:初始化最大值要最大化所有村莊,因為題目給的是村莊數目,而不是最大村莊

#include using

namespace

std;

#define ll long long

#define s(x) scanf("%d",&x)

#define sc(x,y) scanf("%d %d",&x,&y)

#define sca(x,y,z) scanf("%d %d %d",&x,&y,&z)

const

int mxn = 1e2+5,inf = 0x3fffffff

;int

n,m,c,r,k,arr[mxn][mxn],dis[mxn],vis[mxn];

int prim(int

now)

}if(index == -1) return -1

; vis[index] = 1

; ans +=dis[index];

for(int k=1;k<=m;k++)

if(!vis[k] && dis[k]>arr[index][k])

dis[k] =arr[index][k];

}return

ans;

}int

main()

prim(

1)==-1?printf("

?\n"):printf("

%d\n

",prim(1

)); }

return0;

}

最短路徑,最短路徑樹和最小生成樹

首先介紹這三個概念,很多人都聽過最短路徑了,但是最短路徑樹卻很少聽過,關於最短路徑樹的介紹也不太多。而最短路徑樹和最小生成樹更是完全不同的兩個概念。最短路徑就是從乙個指定的頂點出發,計算從該頂點出發到其他所有頂點的最短路徑。通常用dijkstra演算法,floyd演算法求解。最短路徑樹spt sho...

最小生成樹和最短路徑

這篇算作是 演算法 第四版部分讀後感吧 我思考這個問題的開始就是糾結最小生成樹prim演算法和最短路徑dijkstra演算法的異同 1.最小生成樹prim演算法 直接從例子開始吧,我們考慮一副這樣的圖 1.將d設為起始點 設定某個點為起始點是隨機的 考慮與它相鄰節點的權重值,圖中黃色節點,也就是d ...

最短路徑 最小生成樹

題目描述 n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離 輸入描述 第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路 接下來m行兩個整數,表示相連的兩個城市的編號 輸出描述 n 1行,表示0號城市到其他城...