经典算法之Dijkstra算法(求图中任意一对顶点间的最短路径)

/************************
author's email:[email protected]
date:2018.1.30
************************/
/*
迪杰斯特拉算法思想:
	设有两个顶点集合S和T,集合S中存放图中已找到最短路径的顶点,集合T存放图中剩余顶点,初始状态时
	集合S中只包含源点v0,然后不断从集合T中选取到顶点v0路径长度最短的顶点Vu并入到集合S中。集合S
	每并入一个新的顶点Vu,都要修改顶点V0到集合T中顶点的最短路径长度值。不断重复此过程,直到集合T
	的顶点全部并入到S中为止。
迪杰斯特拉算法时间复杂度分析:
	由算法代码可知,本算法主要部分为一个双重循环,外层循环内部有两个并列的单层循环,可以在取一个
	循环内的操作作为基本操作,基本操作执行的总次数即为双重循环执行的次数,为n^2次,因此本算法的
	时间复杂度为O(n^2)。
*/
#include
#define INF 100//INF为比图中任何权值都大的数
#define maxSize 7   //图的顶点数
#define number 12   //图的边数
using namespace std;
typedef struct {//图的定义
	int edges[maxSize][maxSize];//邻接矩阵的定义
	int n, e;   //分别为顶点数和边数
}MGraph;
MGraph createGraph(MGraph g);
void Dijkstra(MGraph g, int v, int dist[], int path[]);/*迪杰斯特拉算法代码,函数结束时
dist[]存放了v点到其余各顶点的最短路径长度,path[]中保存从V到各顶点的最短路径*/
void printfPath(int path[], int a);//输出起始点v到终点a之间的最短路径
int main() {

	MGraph g;//定义并初始化图g
	g.edges[maxSize][maxSize] = { 0 };
	g.n = maxSize; g.e = number;
	g = createGraph(g);//创建一个图

	int dist[maxSize] = {0};
	int path[maxSize] = {0};
	int v = 0;//起始点
	Dijkstra(g, v, dist, path);

	cout << "顶点"<

 

你可能感兴趣的:(经典算法之Dijkstra算法(求图中任意一对顶点间的最短路径))