最小生成樹

2021-07-31 08:01:26 字數 2792 閱讀 4349

普利姆prim演算法就是層層遍歷,一層一層的往下遍歷找到最短的距離連線,標記組中巧妙的用 0 ,和 它的索引,高效的將所有值取到,將陣列用到了極致。該演算法一般常人想到的找最短距離一樣,時間複雜度n^2

克魯斯卡爾演算法有所不一樣,它設計了自己的結構體,在結構體數中有開始,結束,權。將線段所有的資訊進行保留,然後按權排序,從最小的權開始往下選用點,建立乙個陣列用來檢視是否有迴路。時間複雜度eloge

對比倆個演算法,克魯斯卡爾演算法主要是針對邊來展開的。邊數少的時候效率會非常高,對於稀疏圖有很大的優勢,而普利姆演算法對於稠密圖,即邊數比較多的情況會好些

普利姆prim演算法

#include 

#define ok 1

#define error 0

#define true 1

#define false 0

#define maxedge 20

#define maxvex 20

#define infinity 65535

using namespace std;

typedef int status; /* status是函式的型別,其值是函式結果狀態**,如ok等 */

typedef struct

mgraph;

void createmgraph(mgraph *g)/* 構件圖 */

}g->arc[0][1]=10;

g->arc[0][5]=11;

g->arc[1][2]=18;

g->arc[1][8]=12;

g->arc[1][6]=16;

g->arc[2][8]=8;

g->arc[2][3]=22;

g->arc[3][8]=21;

g->arc[3][6]=24;

g->arc[3][7]=16;

g->arc[3][4]=20;

g->arc[4][7]=7;

g->arc[4][5]=26;

g->arc[5][6]=17;

g->arc[6][7]=19;

for(i = 0; i < g->numvertexes; i++)

}}/* prim演算法生成最小生成樹 */

void minispantree_prim(mgraph g)

for(i = 1; i < g.numvertexes; i++)

j++;

}cout << "("

<< adjvex[k] << ","

<< k << ")"

<< endl;/* 列印當前頂點邊中權值最小的邊 */

lowcost[k] = 0;/* 將當前頂點的權值設定為0,表示此頂點已經完成任務 */

for(j = 1; j < g.numvertexes; j++) /* 迴圈所有頂點 */}}

}int main(void)

克魯斯卡爾演算法

#include 

using

namespace

std;

#define ok 1

#define error 0

#define true 1

#define false 0

typedef

int status; /* status是函式的型別,其值是函式結果狀態**,如ok等 */

#define maxedge 20

#define maxvex 20

#define infinity 65535

typedef

struct

mgraph;

typedef

struct

edge; /* 對邊集陣列edge結構的定義 */

/* 構件圖 */

void createmgraph(mgraph *g)

}g->arc[0][1]=10;

g->arc[0][5]=11;

g->arc[1][2]=18;

g->arc[1][8]=12;

g->arc[1][6]=16;

g->arc[2][8]=8;

g->arc[2][3]=22;

g->arc[3][8]=21;

g->arc[3][6]=24;

g->arc[3][7]=16;

g->arc[3][4]=20;

g->arc[4][7]=7;

g->arc[4][5]=26;

g->arc[5][6]=17;

g->arc[6][7]=19;

for(i = 0; i < g->numvertexes; i++)

}}/* 交換權值 以及頭和尾 */

void swapn(edge *edges,int i, int j)

/* 對權值進行排序 */

void sort(edge edges,mgraph *g)}}

cout

<< "權排序之後的為:"

<< endl;

for (i = 0; i < g->numedges; i++)

}/* 查詢連線頂點的尾部下標 */

int find(int *parent, int f)

return f;

}/* 生成最小生成樹 */

void minispantree_kruskal(mgraph g)

}}int main(void)

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

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...