日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

大话数据结构18:最小生成树算法

發(fā)布時(shí)間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大话数据结构18:最小生成树算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

prim最小生成樹(shù)算法

對(duì)于幾個(gè)圖G{V,E};首先從V中任意選擇一個(gè)頂點(diǎn)Vo 將其加入到頂點(diǎn)集合U中,在頂點(diǎn)集合V-U中計(jì)算所有到V中任意頂點(diǎn)假設(shè)是Vo最近的頂點(diǎn)Voo,將其加入到U中,并且記錄邊E{Vo,Voo},一直重復(fù)以上操作直到頂點(diǎn)集合V等于集合U結(jié)束。

代碼實(shí)現(xiàn)

#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0#define MAXEDGE 20 #define MAXVEX 20 #define INFINITY 65535typedef int Status; /* Status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等 */typedef struct {int arc[MAXVEX][MAXVEX];int numVertexes;int numEdges; }MGraph;void CreateMGraph(MGraph* G)/* 構(gòu)件圖 */ {int i, j;/* printf("請(qǐng)輸入邊數(shù)和頂點(diǎn)數(shù):"); */G->numEdges = 15;G->numVertexes = 9;for (i = 0; i < G->numVertexes; i++)/* 初始化圖 */{for (j = 0; j < G->numVertexes; j++){if (i == j)G->arc[i][j] = 0;elseG->arc[i][j] = G->arc[j][i] = INFINITY;}}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++){for (j = i; j < G->numVertexes; j++){G->arc[j][i] = G->arc[i][j];}}}void MiniSpanTree_Prim(MGraph G) {int min, i, j, k;int adjvex[MAXVEX];/* 保存相關(guān)頂點(diǎn)下標(biāo) */int lowcost[MAXVEX];/* 保存相關(guān)頂點(diǎn)間邊的權(quán)值 *//* 初始化第一個(gè)權(quán)值為0,即v0加入生成樹(shù) *//* lowcost的值為0,在這里就是此下標(biāo)的頂點(diǎn)已經(jīng)加入生成樹(shù) */lowcost[0] = 0;adjvex[0] = 0; /* 初始化第一個(gè)頂點(diǎn)下標(biāo)為0 */for (int i = 1; i < G.numVertexes; i++){lowcost[i] = G.arc[0][i]; // //lowcost[j] 記錄的是待加入的頂點(diǎn)中距離adjvex[j]元素的最小值adjvex[i] = 0; /* 初始化都為v0的下標(biāo) */}for (int i = 1; i < G.numVertexes; i++){min = INFINITY;j = 1;k = 0;//循環(huán)全部頂點(diǎn)while (j < G.numVertexes){if (lowcost[j] != 0 && lowcost[j] < min){min = lowcost[j];k = j;}j++;}printf("(%d, %d)\n", adjvex[k], k);/* 打印當(dāng)前頂點(diǎn)邊中權(quán)值最小的邊 */lowcost[k] = 0;/* 將當(dāng)前頂點(diǎn)的權(quán)值設(shè)置為0,表示此頂點(diǎn)已經(jīng)完成任務(wù) */for (j = 1; j < G.numVertexes; j++) /* 循環(huán)所有頂點(diǎn) */{if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j]){/* 如果下標(biāo)為k頂點(diǎn)各邊權(quán)值小于此前這些頂點(diǎn)未被加入生成樹(shù)權(quán)值 */lowcost[j] = G.arc[k][j];/* 將較小的權(quán)值存入lowcost相應(yīng)位置 */adjvex[j] = k; /* 將下標(biāo)為k的頂點(diǎn)存入adjvex */}}} } int main(void) {MGraph G;CreateMGraph(&G);MiniSpanTree_Prim(G);return 0;}

克魯斯卡爾算法

算法原理 先把所有邊排序 依次將最小的邊加入到選擇中,加入的過(guò)程要保證不能出現(xiàn)環(huán)

保證不出現(xiàn)環(huán)的方法:很多 大話數(shù)據(jù)結(jié)構(gòu)中給了一個(gè)方法 就是利用一個(gè)數(shù)組保存已經(jīng)選擇的邊,具體解釋起來(lái)比較麻煩

#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h"#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0typedef int Status; /* Status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等 */#define MAXEDGE 20 #define MAXVEX 20 #define INFINITY 65535typedef struct {int arc[MAXVEX][MAXVEX];int numVertexes;int numEdges; }MGraph;typedef struct {int begin;int end;int weight; }Edge; /* 對(duì)邊集數(shù)組Edge結(jié)構(gòu)的定義 *//* 構(gòu)件圖 */ void CreateMGraph(MGraph* G) {int i, j;/* printf("請(qǐng)輸入邊數(shù)和頂點(diǎn)數(shù):"); */G->numEdges = 15;G->numVertexes = 9;for (i = 0; i < G->numVertexes; i++)/* 初始化圖 */{for (j = 0; j < G->numVertexes; j++){if (i == j)G->arc[i][j] = 0;elseG->arc[i][j] = G->arc[j][i] = INFINITY;}}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++){for (j = i; j < G->numVertexes; j++){G->arc[j][i] = G->arc[i][j];}}}/* 交換權(quán)值 以及頭和尾 */ void Swapn(Edge* edges, int i, int j) {int temp;temp = edges[i].begin;edges[i].begin = edges[j].begin;edges[j].begin = temp;temp = edges[i].end;edges[i].end = edges[j].end;edges[j].end = temp;temp = edges[i].weight;edges[i].weight = edges[j].weight;edges[j].weight = temp; }/* 對(duì)權(quán)值進(jìn)行排序 */ void sort(Edge edges[], MGraph* G) {int i, j;for (i = 0; i < G->numEdges; i++){for (j = i + 1; j < G->numEdges; j++){if (edges[i].weight > edges[j].weight){Swapn(edges, i, j);}}}printf("權(quán)排序之后的為:\n");for (i = 0; i < G->numEdges; i++){printf("(%d, %d) %d\n", edges[i].begin, edges[i].end, edges[i].weight);}}/* 查找連線頂點(diǎn)的尾部下標(biāo) */ int Find(int* parent, int f) {while (parent[f] > 0){f = parent[f];}return f; }/* 生成最小生成樹(shù) */ void MiniSpanTree_Kruskal(MGraph G) {int i, j, n, m;int k = 0;int parent[MAXVEX];/* 定義一數(shù)組用來(lái)判斷邊與邊是否形成環(huán)路 */Edge edges[MAXEDGE];/* 定義邊集數(shù)組,edge的結(jié)構(gòu)為begin,end,weight,均為整型 *//* 用來(lái)構(gòu)建邊集數(shù)組并排序********************* */for (i = 0; i < G.numVertexes - 1; i++){for (j = i + 1; j < G.numVertexes; j++){if (G.arc[i][j] < INFINITY){edges[k].begin = i;edges[k].end = j;edges[k].weight = G.arc[i][j];k++;}}}sort(edges, &G);/* ******************************************* */for (i = 0; i < G.numVertexes; i++)parent[i] = 0; /* 初始化數(shù)組值為0 */printf("打印最小生成樹(shù):\n");for (i = 0; i < G.numEdges; i++) /* 循環(huán)每一條邊 */{n = Find(parent, edges[i].begin);m = Find(parent, edges[i].end);if (n != m) /* 假如n與m不等,說(shuō)明此邊沒(méi)有與現(xiàn)有的生成樹(shù)形成環(huán)路 */{parent[n] = m; /* 將此邊的結(jié)尾頂點(diǎn)放入下標(biāo)為起點(diǎn)的parent中。 *//* 表示此頂點(diǎn)已經(jīng)在生成樹(shù)集合中 */printf("(%d, %d) %d\n", edges[i].begin, edges[i].end, edges[i].weight);}} }int main(void) {MGraph G;CreateMGraph(&G);MiniSpanTree_Kruskal(G);return 0; }

總結(jié)

以上是生活随笔為你收集整理的大话数据结构18:最小生成树算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。