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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

最小生成树实验报告c语言,最小生成树(C语言, prim算法)

發(fā)布時間:2025/3/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最小生成树实验报告c语言,最小生成树(C语言, prim算法) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圖(來源:<>p250)

#include

#include

#include

/*

* 鄰接矩陣, prim普里姆算法(屬貪婪算法),無向圖,最小生成樹

* 代碼實(shí)現(xiàn)<>p250 圖7-6-6,v0至v8分別用ABCDEFGHI代替(不過打印過程還是用的下標(biāo))

* 最終成生n-1條邊的樹,路徑權(quán)值和最小

*/

#define MAX 9

#define INFINITY 65535

// 圖結(jié)構(gòu)體

typedef struct {

char vexs[MAX]; // 頂點(diǎn)的數(shù)組,頂點(diǎn)類型為了簡單使用char

int arc[MAX][MAX]; // 邊表二維數(shù)組,值為權(quán)

int numVex;

}GRAPH, *PGRAPH;

void create(PGRAPH);

void gprint(GRAPH);

void prim(GRAPH);

void prim(GRAPH graph)

{

int i, j, k, min;

// 保存相關(guān)節(jié)點(diǎn)的數(shù)組(也可叫作父子(前后)關(guān)系,下標(biāo)為當(dāng)前節(jié)點(diǎn),值為前一個節(jié)點(diǎn),形成1條邊)

int adjVex[MAX];

// 保存節(jié)點(diǎn)相關(guān)的邊的最小權(quán)值(這個是隨著程序不斷迭代而更新的)

int lowcost[MAX];

// 循環(huán)處理前的初始化工作

adjVex[0] = 0; // 以第1個頂點(diǎn)為開頭,直接加入v0節(jié)點(diǎn)

lowcost[0] = 0; // v0節(jié)點(diǎn)不需要再計算權(quán)值,標(biāo)識為0,0還有個意思表示該節(jié)點(diǎn)已經(jīng)加入最小生成樹

// 使用v0節(jié)點(diǎn)相關(guān)的數(shù)據(jù),初始化上面2個數(shù)組

for (i=0; i

//先全部初始化為0,表示所有節(jié)點(diǎn)的前1個節(jié)點(diǎn)都先為v0

adjVex[i] = 0;

// v0節(jié)點(diǎn)相關(guān)的邊權(quán)值加入數(shù)組,因為入口是v0節(jié)點(diǎn),這些是目前可以看到的相關(guān)的邊

lowcost[i] = graph.arc[0][i];

}

/*

* 開始循環(huán)處理,次數(shù)為n-1,n為節(jié)點(diǎn)數(shù)

*/

// v0入口節(jié)點(diǎn)已經(jīng)加入過數(shù)組不需要處理,所以從1開始

for (i=1; i

// 每輪都需要計算當(dāng)前未加入最小生成樹中的節(jié)點(diǎn)相關(guān)的最小權(quán)的邊

int min = INFINITY;

// 先在lowcost數(shù)組中找出當(dāng)前可以看到的邊中,權(quán)值最小的那條邊

for (j=1; j

if (lowcost[j] !=0 && lowcost[j] < min) {

min = lowcost[j];

k = j;

}

}

// 新找到的最小權(quán)值的邊的相關(guān)節(jié)點(diǎn)為新查找根節(jié)點(diǎn),標(biāo)識為0,放入最小生成樹

lowcost[k] = 0;

printf("%d->%d\n", adjVex[k], k); //adjVex可以知道相關(guān)節(jié)點(diǎn)前后關(guān)系

// 把符合條件的與新根節(jié)點(diǎn)(行)有關(guān)的邊、節(jié)點(diǎn)信息更新到數(shù)組,供下一輪查找

for (j=1; j

if (lowcost[j] != 0 && graph.arc[k][j] < lowcost[j]) {

lowcost[j] = graph.arc[k][j];

adjVex[j] = k; // 只要找到的更新其前節(jié)點(diǎn)為k;

}

}

}

}

void create(PGRAPH g)

{

int i, j;

g->numVex = 9;

// 創(chuàng)建頂點(diǎn)

g->vexs[0] = 'A';

g->vexs[1] = 'B';

g->vexs[2] = 'C';

g->vexs[3] = 'D';

g->vexs[4] = 'E';

g->vexs[5] = 'F';

g->vexs[6] = 'G';

g->vexs[7] = 'H';

g->vexs[8] = 'I';

// 初始化邊表

for (i=0; inumVex; i++) {

for (j=0; jnumVex; j++) {

g->arc[i][j] = INFINITY;

if (j == i)

g->arc[i][j] = 0; //行列相等時表示自身,標(biāo)識為0

}

}

// 添加邊及權(quán)值

// A v0, B v1, C v2, D v3, E v4, F v5, G v6, H v7, I, v8

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

void gprint(GRAPH graph)

{

int i, j;

for (i=0; i

for (j=0; j

printf("%6d ", graph.arc[i][j]);

}

putchar('\n');

}

}

int main(void)

{

GRAPH graph;

create(&graph);

gprint(graph);

prim(graph);

return 0;

}

output

[root@8be225462e66 c]# gcc prim.c && ./a.out

0 10 65535 65535 65535 11 65535 65535 65535

10 0 18 65535 65535 65535 16 65535 12

65535 18 0 22 65535 65535 65535 65535 8

65535 65535 22 0 20 65535 24 16 21

65535 65535 65535 20 0 26 65535 7 65535

11 65535 65535 65535 26 0 17 65535 65535

65535 16 65535 24 65535 17 0 19 65535

65535 65535 65535 16 7 65535 19 0 65535

65535 12 8 21 65535 65535 65535 65535 0

0->1

0->5

1->8

8->2

1->6

6->7

7->4

7->3

[root@8be225462e66 c]#

標(biāo)簽:prim,16,MAX,C語言,vexs,算法,arc,65535,節(jié)點(diǎn)

來源: https://blog.51cto.com/sndapk/2700196

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的最小生成树实验报告c语言,最小生成树(C语言, prim算法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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