最小生成樹 礦井供電問題

2021-10-11 02:23:09 字數 1863 閱讀 6096

新的開始

【題目描述】

發展採礦業當然首先得有礦井, 小ff花了上次探險獲得的千分之一的財富請人在島上挖了n口礦井, 但他似乎忘記考慮的礦井供電問題……
為了保證電力的**, 小ff想到了兩種辦法:

1、 在這一口礦井上建立乙個發電站, 費用為v(發電站的輸出功率可以供給任意多個礦井)。

2、 將這口礦井與另外的已經有電力**的礦井之間建立電網, 費用為p。

小ff希望身為」newbe_one"計畫首席工程師的你幫他想出乙個保證所有礦井電力**的最小花費。

【輸入格式】 第一行乙個整數n, 表示礦井總數。

第2~n+1行,每行乙個整數, 第i個數v[i]表示在第i口礦井上建立發電站的費用。

接下來為乙個n*n的矩陣p, 其中p[ i , j ]表示在第i口礦井和第j口礦井之間建立電網的費用(資料保證有p[ i, j ] = p[ j, i ], 且 p[ i, i ]=0)。

【輸出格式】僅乙個整數, 表示讓所有礦井獲得充足電能的最小花費。

【輸入樣例】

4

5 44 3

0 2 2 2

2 0 3 3

2 3 0 4

2 3 4 0

【輸出樣例】

9
輸出樣例說明: 小ff可以選擇在4號礦井建立發電站然後把所有礦井都與其建立電網,總花費是 3+2+2+2 = 9。

【資料範圍】 對於30%的資料: 1<=n<=50;

對於100%的資料:  1<=n<=300;   0<=v[i], p[i,j] <=10^5.
題解:最小生成樹,礦井上建立乙個發電站, 費用為v(發電站的輸出功率可以供給任意多個礦井),由此我們可以化為邊的形式,如果在這個礦井上建立了發電站,那就可以和其他任何乙個頂點相連,相當於說是有路徑,因此,我們可以多加乙個0點或者n+1點,當作發電站的頂點,然後使用prim演算法,就可以實現,我這裡使用的0點。

**如下

#include

#include

int n,e[

310]

[310

],book[

310]

,dis[

310]

,minn,inf=

99999999

,ans;

long

long sum;

void

prime()

} book[u]=1

; ans++

; sum+

=dis[u]

;for

(k=1

;k<=n;k++)}

printf

("%lld\n"

,sum);}

intmain()

}for

(i=1

;i<=n;i++

)for

(i=1

;i<=n;i++

)for

(j=1

;j<=n;j++

)scanf

("%d"

,&e[i]

[j])

; sum=0;

ans=0;

book[0]

=1; ans++

;for

(i=0

;i<=n;i++

) dis[i]

=e[0

][i]

;prime()

;return0;

}

最小生成樹問題

1.構造可以使n個城市連線的最小生成樹。問題描述 給定乙個地區的n個城市間的距離網,用prim演算法或kruskal演算法建立最小生成樹,並計算得到的最小生成樹的代價。4 要求 1 城市間的距離網採用鄰接矩陣表示,鄰接矩陣的儲存結構定義採用課本中給出的定義,若兩個城市之間不存在道路,則將相應邊的權值...

最小生成樹問題

最小生成樹 是一棵樹 無迴路 個頂點一定有 條邊 包含全部頂點 條邊都在圖里 邊的權重和最小 生成約束 只能用圖里有的邊 只能正好用掉 條邊 不能有迴路 主要演算法 prim演算法 讓樹長大 int prim int n int ans 0 距離權值總和 vis 1 true 生成樹的根 起點 標記...

最小生成樹問題

最小生成樹 乙個有n個點的圖,邊一定是大於等於n 1條的。圖的最小生成樹,就是在這些邊中選擇n 1條出來,連線所有的n個點。這n 1條邊的邊權之和是所有方案中最小的。最小生成樹用來解決什麼問題?就是用來解決如何用最小的 代價 用n 1條邊連線n個點的問題。例題 洛谷p3366 乾坤大挪移 最小生成樹...