新的開始
【題目描述】
發展採礦業當然首先得有礦井, 小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 乾坤大挪移 最小生成樹...