mst在前面學習了kruskal演算法,還有一種演算法叫做prim的。這兩者的區別是prim演算法適合稠密圖,比如說鳥巢這種幾乎所有點都有相連的圖。其時間複雜度為o(n^2),其時間複雜度與邊的數目無關;而kruskal演算法的時間複雜度為o(eloge),跟邊的數目有關,適合稀疏圖。
prim演算法
基本思想:假設g=(v,e)是連通的,te是g上最小生成樹中邊的集合。演算法從u=(u0∈v),te=開始。重複執行下列操作:
1.在所有u∈u,v∈v-u的邊(u,v)∈e中找一條權值最小的邊(u0,v0)併入集合te中,同時v0併入u,直到v=u為止;接下裡以 v0為邊的起點,繼續尋找權值最小的邊併入集合te中,依次往復;
2.最後,te中必有n-1條邊,t=(v,te)為g的最小生成樹。
prim演算法的核心:始終保持te中的邊集構成一棵生成樹,也就是它與kruskal演算法的主要區別是,prim是一直保持一種串聯的狀態而不遵從整體的貪心演算法。其實初始點uo的選擇可以隨意,一般做題題目條件會給出或者取最小的權值邊。
其實現的**如下:
#include #include #include
#define infinity 1000000
#define max_vertexes 6
typedef int graph[max_vertexes][max_vertexes];
void prim(graph g,int vcount,int father)
edge;
typedef edge *edgenode;
int arcnum; /*邊的個數*/
/*建立圖的鄰接矩陣*/
void creatmatrix(adjmatrix ga)
else
} }printf("請輸入邊的個數:");
scanf("%d",&arcnum);
printf("請輸入邊的資訊,按照起點,終點,權值的形式輸入:\n");
for(k=1;k<=arcnum;k++)
}/*初始化圖的邊集陣列*/
void initedge(edgenode ge,int m)
}/*根據圖的鄰接矩陣生成圖的邊集陣列*/
void getedgeset(adjmatrix ga,edgenode ge)
} }}/*按公升序排列圖的邊集陣列*/
void sortedge(edgenode ge,int m)
} if(k!=i) }}
/*利用普里姆演算法從初始點v出發求鄰接矩陣表示的圖的最小生成樹*/
void prim(adjmatrix ga,edgenode t)
} /*進行n-1次迴圈,每次求出最小生成樹中的第k條邊*/
for(k=1;k
Prim演算法求MST 最小生成樹
prim演算法求最小生成樹使用的圖的儲存結構是圖的鄰接矩陣 include define max vertax size 20 define infinite 65535 define ok 1 define error 0 圖的鄰接矩陣表示的結構定義 typedef int status type...
最小生成樹(MST)
在帶權圖中,所有的生成樹中邊權的和最小的那棵 或幾棵 被稱為最小生成樹。幾點注意 求最小生成樹使用kruskal演算法。使用並查集處理節點的集合屬性,初始時所有結點屬於只包含其自身的孤立集合。實現 include include using namespace std define n 101 in...
最小生成樹 MST
1 prim演算法 對點進行貪心操作。適合稠密圖 const int m 1005 int vis m 表示該i點是否被選擇 vis i 0 還未被選擇 int map m m map i j 表示i到j的距離 int dis m 1到i的距離和 void prim cout sum 2 krusk...