kruska生成樹 鄰接矩陣

2021-06-22 20:21:22 字數 2627 閱讀 7048

/* c: dijkstra演算法獲取最短路徑(鄰接矩陣)

** @author  grant golden

* @date 2014/04/24

*/#include

#include

#include

#include

#define max         100                 // 矩陣最大容量

#define inf         (~(0x1<<31))        // 最大值(即0x7fffffff)

#define isletter(a) ((((a)>='a')&&((a)<='z')) || (((a)>='a')&&((a)<='z')))

#define length(a)   (sizeof(a)/sizeof(a[0]))//計算矩陣長度

// 鄰接矩陣

typedef struct _graph

graph, *pgraph;

// 邊的結構體

typedef struct _edgedata

edata;

/** 返回ch在matrix矩陣中的位置

*/static int get_position(graph g, char ch)

if ((pg=(graph*)malloc(sizeof(graph))) == null )

return null;

memset(pg, 0, sizeof(graph));

// 初始化"頂點數"和"邊數"

pg->vexnum = v;

pg->edgnum = e;

// 初始化"頂點"

for (i = 0; i < pg->vexnum; i++)

// 1. 初始化"邊"的權值

for (i = 0; i < pg->vexnum; i++)

}// 2. 初始化"邊"的權值: 根據使用者的輸入進行初始化

for (i = 0; i < pg->edgnum; i++)

pg->matrix[p1][p2] = weight;

pg->matrix[p2][p1] = weight;

}return pg;}/*

* 建立圖(用已提供的矩陣)

*/graph* create_example_graph()

;int matrix[9] = ,

/*b*/ ,

/*c*/ ,

/*d*/ ,

/*e*/ ,

/*f*/ ,

/*g*/ };

int vlen = length(vexs);

int i, j;

graph* pg;

// 輸入"頂點數"和"邊數"

if ((pg=(graph*)malloc(sizeof(graph))) == null )

return null;

memset(pg, 0, sizeof(graph));

// 初始化"頂點數"

pg->vexnum = vlen;

// 初始化"頂點"

for (i = 0; i < pg->vexnum; i++)

pg->vexs[i] = vexs[i];

// 初始化"邊"

for (i = 0; i < pg->vexnum; i++)

for (j = 0; j < pg->vexnum; j++)

pg->matrix[i][j] = matrix[i][j];

// 統計邊的數目

for (i = 0; i < pg->vexnum; i++)

for (j = 0; j < pg->vexnum; j++)

if (i!=j && pg->matrix[i][j]!=inf)

pg->edgnum++;

pg->edgnum /= 2;

return pg;}/*

* 列印矩陣佇列圖

*/void print_graph(graph g)

}/* 

* 獲取圖中的邊

*/edata* get_edges(graph g)}}

return edges;

}/* 

* 對邊按照權值大小進行排序(由小到大)

*/void sorted_edges(edata* edges, int elen)}}

}/** 獲取i的終點

*/int get_end(int vends, int i)

/** 克魯斯卡爾(kruskal)最小生成樹

*/void kruskal(graph g)

;     // 用於儲存有"已最小生成樹"中每個頂點在該最小樹中的終點。

edata rets[max];        // 結果陣列,儲存kruskal最小生成樹的邊

edata *edges;           // 圖對應的所有邊

// 獲取"圖中所有的邊"

edges = get_edges(g);

// 將邊按照"權"的大小進行排序(從小到大)

sorted_edges(edges, g.edgnum);

for (i=0; isystem("pause");

}

最小生成樹Prim演算法(鄰接矩陣和鄰接表)

最小生成樹,普利姆演算法 簡述演算法 先初始化一棵只有乙個頂點的樹,以這一頂點開始,找到它的最小權值,將這條邊上的令乙個頂點新增到樹中 再從這棵樹中的所有頂點中找到乙個最小權值 而且權值的另一頂點不屬於這棵樹 重複上一步 直到所有頂點併入樹中 圖示 注 以a點開始,最小權值為 另一頂點是 將 加入到...

鄰接矩陣學習

鄰接矩陣 是表示頂點之間相鄰關係的矩陣。因此,用乙個一維陣列存放圖中所有頂點資料 用乙個二維陣列存放頂點間的關係 邊或弧 的資料,這個二維陣列稱為鄰接矩陣。鄰接矩陣又分為有向圖鄰接矩陣和無向圖鄰接矩陣。設g v,e 是乙個圖,其中v g的鄰接矩陣是乙個具有下列性質的n階方陣 對無向圖而言,鄰接矩陣一...

鄰接矩陣學習

鄰接矩陣 是表示頂點之間相鄰關係的矩陣。因此,用乙個一維陣列存放圖中所有頂點資料 用乙個二維陣列存放頂點間的關係 邊或弧 的資料,這個二維陣列稱為鄰接矩陣。鄰接矩陣又分為有向圖鄰接矩陣和無向圖鄰接矩陣。設g v,e 是乙個圖,其中v g的鄰接矩陣是乙個具有下列性質的n階方陣 對無向圖而言,鄰接矩陣一...