C語言 迪傑克斯特拉演算法的實現

2021-07-29 18:44:36 字數 1482 閱讀 2840

dijkstra尋找最短路徑演算法

由於涉及操作物件是「圖」,故描述圖使用鄰接矩陣。

1. 鄰接矩陣無向圖的表示

a-----b-----c       a  b  c

d| a 010

1| b 101

0dc0

100d

1000

因為是無向圖所以鄰接矩陣對稱。當兩個節點有邊連線則記該邊權重,無邊連線記0;

//鄰接矩陣

typedef

struct _graph

鄰接矩陣的初始化,即建立乙個圖

graph * create_graph();

char edges[2] =

}//二維陣列表示邊兩端頂點

int vlen = length(vexs); //計算陣列元素個數

int elen = length(edges);//計算邊陣列元素個數

int i, p1, p2;

graph * pg;//申請要返回的圖

//寫入結構體

pg->vexnum = vlen;

pg->edgnum = elen;

//初始化頂點,寫入結構體中

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

//初始化「邊」—鄰接矩陣,寫入結構體中

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

return pg;

}

要點:記住graph結構體的屬性,再將已知內容填入完成初始化。

void dijkstra(graph g, int vs,int prev, int dist)

//初始化vs

flag[vs] = 1;

dist[vs] = 0;

//遍歷 g.vexnum-1(頂點個數減一次)次,每次找出乙個頂點距離vx最短

intmin;//記錄當前為止最短路徑長度;

for(int i = 0 ; i < g.vexnum-1; i++)

}// 標記"頂點k"為已經獲取到最短路徑

flag[k] = 1;

// 修正當前最短路徑和前驅頂點

// 即,當已經"頂點k的最短路徑"之後,更新"未獲取最短路徑的頂點的最短路徑和前驅頂點"。

for (int j = 0; j < g.vexnum; j++)

}} // 列印dijkstra最短路徑的結果

printf("dijkstra(%c): \n", g.vexs[vs]);

for (i = 0; i < g.vexnum; i++)

printf(" shortest(%c, %c)=%d\n", g.vexs[vs], g.vexs[i], dist[i]);

迪傑斯特拉演算法 C語言

include include define infin 65535 define max vertex num 20 int final 6 typedef enum graphkind 有向圖,有向網,無向圖,無向網 typedef struct arccell arccell,adjmatri...

C語言實現 迪傑斯特拉演算法

我今天看了一天的這個演算法,硬是沒有搞明白,好吧,推薦大家看看土豆上邊的乙個叫 正月點燈籠 的人,講的很好。include define inf 0x7fffffff define maxn 50 int matrix maxn maxn void dijkstra int out,int n,in...

斯特拉演算法Dijkstra 迪傑斯特拉 演算法

dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...