信息学奥赛一本通1349-最优布线问题
【題目描述】
學(xué)校有n臺(tái)計(jì)算機(jī),為了方便數(shù)據(jù)傳輸,現(xiàn)要將它們用數(shù)據(jù)線連接起來。兩臺(tái)計(jì)算機(jī)被連接是指它們有數(shù)據(jù)線連接。由于計(jì)算機(jī)所處的位置不同,因此不同的兩臺(tái)計(jì)算機(jī)的連接費(fèi)用往往是不同的。
當(dāng)然,如果將任意兩臺(tái)計(jì)算機(jī)都用數(shù)據(jù)線連接,費(fèi)用將是相當(dāng)龐大的。為了節(jié)省費(fèi)用,我們采用數(shù)據(jù)的間接傳輸手段,即一臺(tái)計(jì)算機(jī)可以間接的通過若干臺(tái)計(jì)算機(jī)(作為中轉(zhuǎn))來實(shí)現(xiàn)與另一臺(tái)計(jì)算機(jī)的連接。
現(xiàn)在由你負(fù)責(zé)連接這些計(jì)算機(jī),任務(wù)是使任意兩臺(tái)計(jì)算機(jī)都連通(不管是直接的或間接的)。
【輸入】
第一行為整數(shù)n(2≤n≤100),表示計(jì)算機(jī)的數(shù)目。此后的n行,每行n個(gè)整數(shù)。第x+1行y列的整數(shù)表示直接連接第x臺(tái)計(jì)算機(jī)和第y臺(tái)計(jì)算機(jī)的費(fèi)用。
【輸出】
一個(gè)整數(shù),表示最小的連接費(fèi)用。
【輸入樣例】
3
0 1 2
1 0 1
2 1 0
【輸出樣例】
2
【提示】
注:表示連接1和2,2和3,費(fèi)用為2。
解題思路
就是最小生成樹而已,這里用時(shí)間復(fù)雜度是O(n^2)的算法(既Prim法)。
代碼
#include<cstdio> using namespace std; int n,k,cost[101][101],lowcost[101],x,s; bool ok[101]; int main() {scanf("%d",&n);for (int i=1;i<=n;i++)for (int j=1;j<=n;j++) cost[i][j]=23333333;//初始化無窮大for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){scanf("%d",&cost[i][j]);//輸入權(quán)值}}for (int i=1;i<=n;i++) lowcost[i]=cost[1][i];//記錄每個(gè)點(diǎn)到目前集合最小花費(fèi)ok[1]=true;//標(biāo)記為以搜過for (int i=2;i<=n;i++){int k=0,mins=23333333;for (int j=1;j<=n;j++)if (!ok[j] && lowcost[j]<mins){mins=lowcost[j];k=j;//找并且記錄最小值}ok[k]=true;//標(biāo)記,更新集合s+=lowcost[k];//記錄總值for (int j=1;j<=n;j++)if (lowcost[j]>cost[k][j]) lowcost[j]=cost[k][j]; //更新每個(gè)點(diǎn)到目前集合最小花費(fèi)}printf("%d",s); }總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通1349-最优布线问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: u盘怎样重装系统u盘如何重做电脑系统
- 下一篇: ssl1562-局域网