C 最小生成樹問題

2021-05-25 11:45:46 字數 1344 閱讀 4297

問題描述

求乙個連通無向圖的最小生成樹的代價(圖邊權值為正整數)。

輸入

第一行是乙個整數n(1<=n<=20),表示有多少個圖需要計算。以下有n個圖,第i圖的第一行是乙個整數m(1<=m<=50),表示圖的頂點數,第i圖的第2行至1+m行為乙個m*m的二維矩陣,其元素ai,j表示圖的i頂點和j頂點的連線情況,如果ai,j=0,表示i頂點和j頂點不相連;如果ai,j>0,表示i頂點和j頂點的連線權值。

輸出

每個用例,用一行輸出對應圖的最小生成樹的代價。

樣例輸入1

6 0 6 1 5 0 0

6 0 5 0 3 0

1 5 0 5 6 4

5 0 5 0 0 2

0 3 6 0 0 6

0 0 4 2 6 0

樣例輸出15

分析:

很明顯,這是乙個無向圖,因為我們看到這個矩陣,它是對稱的。

=>我們取它的左下角元素來進行操作,**裡就是讓行 i 大於列 j.

=>存在結構體裡面,按邊的長度由小到大排序。

=>因為有n個頂點,所以我們要記錄它各個頂點的值,來判斷兩個頂點之間是不是已經有邊連線。

下面說一下分析步驟:

我的由輸入得到這個圖:

從長度由小到大連線,符合條件(a[i]不等於a[j])的就操作,其它的不操作:

每一步都要把值與左邊的值相同的全設定為右邊的數:

兩端數值相等就不要操作了。

最後把符合條件的邊的長度加起來就是我們求的最小生成樹的代價。

**:#include

using namespace std;

struct node

;void insert(node *&h,node *p)   //指標插入排序

p->next=q->next;

q->next=p;

}int main()

h=new node;

p=h;

p->next=null;

for (i=1;i<=m;i++)

for (j=1;j<=m;j++)

}p=h->next;

while (p)

}p=p->next;

}/*   可以測試程式工作是否正常

p=h->next;

while(p)

*/cout<

最小生成樹問題

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 乾坤大挪移 最小生成樹...