Dijkstra算法

来源:互联网 发布:网络推广是网络策划吗 编辑:程序博客网 时间:2024/04/29 01:14

Dijkstra算法是寻找最短路径的一种方法,算法的思想是将路径顶点分为两类,一类为已找到的最优路径,一部分为还没有找到,每迭代一次会从未寻找的顶点中寻找到已经寻找到的最优路径的顶点的最优顶点,并更新最优路径到为寻找到的距离;

#include "stdafx.h"#include <iostream>#include <vector>using namespace std;const int maxnum = 100;const int maxint = 999999;void searchPath(int *prev, int v, int u){int que[maxnum];int tot = 1;que[tot] = u;tot++;int tmp = prev[u];while (tmp != v){que[tot] = tmp;tot++;tmp = prev[tmp];}que[tot] = v;for (int i = tot; i >= 1; --i)if (i != 1)cout << que[i] << " -> ";elsecout << que[i] << endl;}//个人实现的DIJ算法void Dijkstra(int n, int v, int *dist, int *prev, int c[maxnum][maxnum]){//n顶点数目、v起始点、dist记录最短距离、prev、记录前一个点//c距离矩阵//从起点v开始计算每个最短距离int flag[maxnum] = { 0 };//标记是否被选定for (int i = 1; i <= n; ++i){dist[i] = c[v][i];prev[i] = 0;}flag[v] = 1;dist[v] = 0;//寻找最短的路径for (int j = 2; j != n; ++j){int mindis = maxint;int temp_id;for (int i = 1; i <= n; ++i){if (!flag[i]&&dist[i]< mindis){mindis =dist[i];temp_id = i;}}flag[temp_id] = 1;          //进行变换矩阵,确定最小距离for (int i = 1; i <= n; ++i){if (!(flag[i]) && dist[temp_id] + c[temp_id][i] <dist[i]){dist[i] = dist[temp_id] + c[temp_id][i];prev[i] = temp_id;cout << prev[i] << " ";}}}}int _tmain(int argc, _TCHAR* argv[]){/*freopen("input.txt", "r", stdin);*/// 各数组都从下标1开始int dist[maxnum];     // 表示当前点到源点的最短路径长度int prev[maxnum];     // 记录当前点的前一个结点int c[maxnum][maxnum];   // 记录图的两点间路径长度int n, line;             // 图的结点数和路径数// 输入结点数cin >> n;// 输入路径数cin >> line;int p, q, len;          // 输入p, q两点及其路径长度// 初始化c[][]为maxintfor (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)c[i][j] = maxint;//输入路径for (int i = 1; i <= line; ++i){cin >> p >> q >> len;if (len < c[p][q])       // 有重边{c[p][q] = len;      // p指向qc[q][p] = len;      // q指向p,这样表示无向图}}//初始化点之间的距离for (int i = 1; i <= n; ++i)dist[i] = maxint;for (int i = 1; i <= n; ++i){for (int j = 1; j <= n; ++j)printf("%8d", c[i][j]);printf("\n");}Dijkstra(n, 1, dist, prev, c);for (int i = 1; i <= n;++i)cout << prev[i] << " ";// 最短路径长度cout << "源点到最后一个顶点的最短路径长度: " << dist[n] << endl;// 路径cout << "源点到最后一个顶点的路径为: ";searchPath(prev, 1, n);system("pause");return 0;}


0 0