/* 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階方陣 對無向圖而言,鄰接矩陣一...