最小生成樹演算法

2021-09-25 20:17:04 字數 1285 閱讀 6634

顧名思義,這是用來解決聯通圖中,遍歷所有的點,花費權值之和最小的演算法

解決問題有兩種方法,第乙個是遍歷所有的邊,第二個是遍歷所有的點

kruscal演算法

總的思想其實很容易理解,對於連通圖來說,最小的邊一定屬於最小生成樹,這裡就不給證明了,是用反證法求證。

所以得到了所有的邊之後,對結構體陣列進行排序,將邊由小到大進行排序,然後不斷的遍歷,只要一條邊上兩端的端點不屬於同一棵樹,就把這條邊加進來,判斷同一棵樹的方法則是採用並查集

模板**如下——

#include #include #include using namespace std;

const int maxn =1e6+10;

#define inf 0x3f3f3f3f

int m,n;

int parent[maxn];//記錄前乙個節點,或者說記錄根節點

struct bian

bian[maxn];//邊節點結構體

bool cmp(bian x,bian y)//用於從小到大排序

}printf("%d\n",ans);

}int main()

sort(bian+1,bian+n+1,cmp);//排序

kruscal();

}return 0;

}

prim演算法

既然kruscal是用了邊的思想,那麼顯然prim演算法採用的思想——

把已經確定是最小生成樹的點用陣列進行標記,對沒有標記的那些點,通過看他們的鄰接矩陣,來找到權值最小的點,再把它加入到已經標記的點裡面去

具體演算法**如下——

#include #include #include #include #include using namespace std;

#define maxn 1005

#define inf 0x3f3f3f3f

int a[3010][3010],n,m,ans; //用鄰接矩陣儲存圖

bool v[3010]; //標記節點已經加入最小生成樹

int d[3010]; //各節點到最小生成樹的權值

void prim()

prim();

for(int i=2;i<=n;i++)

ans+=d[i];

cout << ans;

}

最小生成樹演算法

由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹 minimum spanning tree 簡稱為mst 構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱...

最小生成樹演算法

乙個最簡單的最小生成樹 圖結構練習 最小生成樹 time limit 1000ms memory limit 65536k 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。輸...

演算法 最小生成樹

前言 最小生成樹是在乙個給定的無向圖中求一棵樹,這棵樹包含無向圖中的所有頂點,且樹中的邊都來自無向圖中的邊,並且要滿足整棵樹的邊權之和最小。1 最小生成樹是樹,其邊數等於頂點數減1,且不會有環 2 對於給定的圖最小生成樹可以不唯一,但是邊權之和一定是唯一的。3 其根節點可以是這棵樹上的任何乙個節點,...