Dijkstra算法
Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
dijkstra算法是解决带权重的单元最短路径问题,要求权重是非负,和Bellman-Ford算法很像,但是不一样,注意Bellman-Ford算法是可以处理负边,但是Dijkstra不可以
代码如下
#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <numeric>
#include <cmath>
#include <regex>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;
const int MAX =
1000000;
void dijkstra()
{
const int n =
6;
int mat[
6][
6] =
{
0,
1000000,
10,
1000000,
30,
100,
1000000,
0,
5,
1000000,
1000000,
1000000,
1000000,
1000000,
0,
50,
1000000,
1000000,
1000000,
1000000,
1000000,
0,
1000000,
10,
1000000,
1000000,
1000000,
20,
0,
60,
1000000,
1000000,
1000000,
1000000,
1000000,
0 };
int dis[n] = {
0 };
int pre[n] = {
0 };
int visit[n] = {
0 };
for (
int i =
0; i<n; i++)
{
dis[i] = mat[
0][i];
if (dis[i] == MAX)
pre[i] = -
1;
else
pre[i] =
0;
}
pre[
0] = -
1;
visit[
0] =
1;
for (
int i =
1; i<n; i++)
{
int minDis = MAX;
int tmp =
0;
for (
int j =
0; j<n; j++)
{
if (visit[j] ==
0 && dis[j] < minDis)
{
tmp = j;
minDis = dis[j];
}
}
visit[tmp] =
1;
for (
int j =
0; j<n; j++)
{
if (visit[j] ==
0 && minDis + mat[tmp][j] < dis[j])
{
dis[j] = minDis + mat[tmp][j];
pre[j] = tmp;
}
}
}
for (
int i =
0; i<n; i++)
cout << dis[i] <<
" ";
cout << endl;
int i = n -
1;
while (i != -
1)
{
cout << i <<
" ";
i = pre[i];
}
}
int main()
{
dijkstra();
system(
"pause");
}