最短路径——迪杰斯特拉算法——图的数据结构
生活随笔
收集整理的這篇文章主要介紹了
最短路径——迪杰斯特拉算法——图的数据结构
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最短路徑是在工程上經常用到的概念,在這里給出了從單源點到任意頂點的迪杰斯特拉算法。
先來看看基本概念:
?
用代碼C語言實現如下:
#include<string.h>#include<ctype.h>#include<malloc.h> /* malloc()等 */#include<limits.h> /* INT_MAX等 */#include<stdio.h> /* EOF(=^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /* exit() *//* 函數結果狀態代碼 */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1typedef int Status; /* Status是函數的類型,其值是函數結果狀態代碼,如OK等 */typedef int Boolean; /* Boolean是布爾類型,其值是TRUE或FALSE */#define MAX_NAME 5 /* 頂點字符串的最大長度 */typedef int InfoType;typedef char VertexType[MAX_NAME]; /* 字符串類型 *//* c7-2.h 圖的鄰接表存儲表示 */#define MAX_VERTEX_NUM 20typedef enum{DG,DN,AG,AN}GraphKind; /* {有向圖,有向網,無向圖,無向網} */typedef struct ArcNode{int adjvex; /* 該弧所指向的頂點的位置 */struct ArcNode *nextarc; /* 指向下一條弧的指針 */InfoType *info; /* 網的權值指針) */}ArcNode; /* 表結點 */typedef struct{VertexType data; /* 頂點信息 */ArcNode *firstarc; /* 第一個表結點的地址,指向第一條依附該頂點的弧的指針 */}VNode,AdjList[MAX_VERTEX_NUM]; /* 頭結點 */typedef struct{AdjList vertices;int vexnum,arcnum; /* 圖的當前頂點數和弧數 */int kind; /* 圖的種類標志 */}ALGraph; typedef int VRType;typedef char InfoType;typedef char VertexType[MAX_NAME]; typedef int PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef int ShortPathTable[MAX_VERTEX_NUM];void ShortestPath_DIJ(MGraph G,int v0,PathMatrix *P,ShortPathTable *D){ /* 用Dijkstra算法求有向網G的v0頂點到其余頂點v的最短路徑P[v]及帶權長度 *//* D[v]。若P[v][w]為TRUE,則w是從v0到v當前求得最短路徑上的頂點。 *//* final[v]為TRUE當且僅當v∈S,即已經求得從v0到v的最短路徑 算法7.15 */int v,w,i,j,min;Status final[MAX_VERTEX_NUM];for(v=0;v<G.vexnum;++v){final[v]=FALSE;(*D)[v]=G.arcs[v0][v].adj;for(w=0;w<G.vexnum;++w)(*P)[v][w]=FALSE; /* 設空路徑 */if((*D)[v]<INFINITY){(*P)[v][v0]=TRUE;(*P)[v][v]=TRUE;}}(*D)[v0]=0;final[v0]=TRUE; /* 初始化,v0頂點屬于S集 */for(i=1;i<G.vexnum;++i) /* 其余G.vexnum-1個頂點 */{ /* 開始主循環,每次求得v0到某個v頂點的最短路徑,并加v到S集 */min=INFINITY; /* 當前所知離v0頂點的最近距離 */for(w=0;w<G.vexnum;++w)if(!final[w]) /* w頂點在V-S中 */if((*D)[w]<min){v=w;min=(*D)[w];} /* w頂點離v0頂點更近 */final[v]=TRUE; /* 離v0頂點最近的v加入S集 */for(w=0;w<G.vexnum;++w) /* 更新當前最短路徑及距離 */{if(!final[w]&&min<INFINITY&&G.arcs[v][w].adj<INFINITY&&(min+G.arcs[v][w].adj<(*D)[w])){ /* 修改D[w]和P[w],w∈V-S */(*D)[w]=min+G.arcs[v][w].adj;for(j=0;j<G.vexnum;++j)(*P)[w][j]=(*P)[v][j];(*P)[w][w]=TRUE;}}}}void main(){int i,j,v0=0; /* v0為源點 */MGraph g;PathMatrix p;ShortPathTable d;CreateDN(&g);ShortestPath_DIJ(g,v0,&p,&d);printf("最短路徑數組p[i][j]如下:\n");for(i=0;i<g.vexnum;++i){for(j=0;j<g.vexnum;++j)printf("%2d",p[i][j]);printf("\n");}printf("%s到各頂點的最短路徑長度為:\n",g.vexs[0]);for(i=1;i<g.vexnum;++i)printf("%s-%s:%d\n",g.vexs[0],g.vexs[i],d[i]);}?
算法時間復雜度:O()。
?
?
總結
以上是生活随笔為你收集整理的最短路径——迪杰斯特拉算法——图的数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3 计算机组成原理第三章 存储系统 主
- 下一篇: 论文阅读课2-Inter-sentenc