最小生成樹 神母牛的實驗

2021-06-08 07:40:15 字數 1279 閱讀 4961

3.神母牛的實驗(experiment.pas/c/cpp)

【題目描述】

有一天神母牛爪子抓手機想做乙個實驗,這個實驗呢,就是點亮小燈泡吶。

為了顯示她的newbe之處,她用了一塊金屬板來安裝這些燈泡(這個金屬板可以視為接地線),並且讓這些燈泡隨機分布。不過她似乎忘記了新增導線和電源- -、

於是神母牛爪子抓手機想到了這樣兩個個辦法:

1、  直接給某個燈泡接上火線,這會消耗她一定的心情值,用v表示;

2、  將某兩個燈泡用導線連線,這也會消耗她一定的心情值,用p表示;

如果神母牛爪子抓手機的心情過差,她就會到機房虐人……把人虐得死去活來。如果所有的燈泡沒有全部被點亮,那麼她的心情值會直接跌到臨界值以下,她還是會來機房虐人,把人虐得死去活來……

這是大家都不希望看見的,所以,你需要找到乙個方案,使所有的燈泡亮起來,並且為了自身安全著想,你要使神母牛爪子抓手機消耗的心情值盡量小,不然你就完了……

【輸入格式】

輸入檔案experiment.in,第一行乙個整數n,表示小燈泡總數,接下來有n行,表示直接給i號燈泡接火線消耗的心情值vi,再接下來,乙個n*n的矩陣,表示第i號燈泡與第j號燈泡之間連一根導線所消耗的心情值(保證有p[i,j]=p[j,i],當然,p[i,i]=0)

【輸出格式】

輸出檔案experiment.out,只有一行,表示最小的心情值消耗

【樣例輸入】

0 2 2 2

2 0 3 3

2 3 0 4

2 3 4 0

【樣例輸出】

【資料範圍】

對於100%的資料,0

簡單題。加上乙個超級源,到每個點連邊,權值為連火線的代價,求最小生成樹。

#include #include #include long dist[310];

long map[310][310];

bool used[310];

long ans = 0;

long getint()

do rs=(rs<<3)+(rs<<1)+tmp-'0';

while (isdigit(tmp=getchar()));

return sgn?rs:-rs;

}long n;

void prim()

} }}int main()

{ freopen("experiment.in","r",stdin);

freopen("experiment.out","w",stdout);

n = getint();

for (long i=1;i

實驗1 最小生成樹的構造

prim演算法 又稱為加邊法,即每次選擇最小權值的邊加入到生成樹中,然後再更新權值,如此反覆,保證每次最優來達到最優解。kruskal演算法 1.對邊按權重排序為e1 e2 2.若已選擇v 1條邊,停止。否則,按邊的權重排序選擇下一條邊。3.判斷選擇的邊的兩點是否在同一連通分支。若不在同一分支,則選...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...