您的位置:首页 > 编程语言

dijkstra算法代码实现

2017-09-04 18:05 411 查看
//最短路径dijkstra算法  图的下标从1开始
//#include"stdafx.h"
#include<iostream>
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: