#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之間有一條邊,且其長...