資料結構 最短路徑 Dijkstra

2021-06-19 04:50:26 字數 1710 閱讀 4763

#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 65535

typedef int status; /* status是函式的型別,其值是函式結果狀態**,如ok等 */

typedef struct

mgraph;

typedef int patharc[maxvex]; /* 用於儲存最短路徑下標的陣列 */

typedef int shortpathtable[maxvex];/* 用於儲存到各點最短路徑的權值和 */

/* 構件圖 */

void createmgraph(mgraph *g)

for (i = 0; i < g->numvertexes; i++)/* 初始化圖 */ }

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

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

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

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

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

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

g->arc[2][5]=7;

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

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

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

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

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

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

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

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

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

for(i = 0; i < g->numvertexes; i++) }

}/* dijkstra演算法,求有向網g的v0頂點到其餘頂點v的最短路徑p[v]及帶權長度d[v] */

/* p[v]的值為前驅頂點下標,d[v]表示v0到v的最短路徑長度和 */

void shortestpath_dijkstra(mgraph g, int v0, patharc *p, shortpathtable *d)

(*d)[v0] = 0; /* v0至v0路徑為0 */

final[v0] = 1; /* v0至v0不需要求路徑 */

/* 開始主迴圈,每次求得v0到某個v頂點的最短路徑 */

for(v=1; v}

final[k] = 1; /* 將目前找到的最近的頂點置為1 */

for(w=0; w} }}

int main(void)

printf("\n");

}

printf("\n源點到各頂點的最短路徑長度為:\n");

for(i=1;iprintf("v%d - v%d : %d \n",g.vexs[0],g.vexs[i],d[i]);

return 0;

}

資料結構實驗 最短路徑

實驗內容 對於使用者隨機輸入的乙個有向帶權圖,求從某個頂點到其他各頂點的最短路徑。include define maxv 20 define inf 32 若不存在,則設的權為32,表示無窮大 typedef struct vertextype 頂點型別 typedef struct matgrap...

資料結構 最短路徑問題

求解這個問題的時候我們用到dijkstra演算法,演算法的描述如下 1 首先定義乙個陣列用來儲存從源點到每乙個頂點的最短路徑 不可達用無窮表示 使用s集合來儲存已經求得最短路徑的頂點,那麼剩餘頂點就存放在集合t中 2 第一次迭代的時候s只有源點,然後根據s集合中的頂點來更新最短路徑陣列d中的值,每次...

HDU3790 最短路徑問題 Dijkstra

problem description 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。input 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長...