dijkstra算法代码实现

//最短路径dijkstra算法  图的下标从1开始
//#include"stdafx.h"
#include
#define size 1010
#define INF 0x3fffffff
using namespace std;
struct Graph {
	int vexNum;//顶点数
	int edge;//边数
	int map[size][size];//图的邻接矩阵
};
Graph g;
int pre[size];//pre[v]的值为前驱顶点下标
int length[size];//length[v]表示startPos到v的最短路径长度和

void dijkstra(int startPos) {
	int i, j;
	int min;
	bool final[size];//标记是否求得顶点startPos至w的最短路径
	//初始化数据
	for (i = 1; i <= g.vexNum; i++) {
		final[i] = false;	   
		length[i] = g.map[startPos][i];  
		pre[i] = startPos;			  
	}
	length[startPos] = 0;
	final[startPos] = true;
	//开始主循环,每次求得startPos到某个v顶点的最短路径,并 加入v到集合S
	for (i = 1; i <= g.vexNum; i++) {
		if (i == startPos)
			continue;
		min = INF;
		//寻找length数组中下标最小的值与下标
		for (j = 1; j <= g.vexNum; j++) {
			if (!final[j] && length[j] < min) {
				min = length[j];
				i = j;
			}
		}
		final[i] = true;
		//更新length和pre
		for (j = 1; j <= g.vexNum; j++) {
			//如果经过i顶点的路径比现在这条路径的长度短的话
			if (!final[j] && (min + g.map[i][j] < length[j])) {
				//说明找到了更短的路径,修改length[j]和pre[j]
				length[j] = min + g.map[i][j];
				pre[j] = i;
			}
		}
	}
}

void init() {
	for (int i = 1; i <= g.vexNum; i++) {
		for (int j = 1; j <= g.vexNum; j++) {
			if (i == j) {
				g.map[i][j] = 0;
			}
			else {
				g.map[i][j] = INF;
			}
		}
	}
}

int main() {
	//输入顶点数、边数
	while (cin >> g.vexNum >> g.edge && g.vexNum) {
		init();
		int startPos, endPos, value;
		for (int i = 0; i < g.edge; i++) {
			cin >> startPos >> endPos >> value;
			g.map[startPos][endPos] = g.map[startPos][endPos] = value;
		}
		//输入最短路径的开始节点与终端节点
		cout << "输入最短路径的开始节点与终端节点" << endl;
		cin >> startPos >> endPos;
		dijkstra(startPos);
		cout << length[endPos] << endl;
	}
	return 0;
}

你可能感兴趣的:(别的东西)