dijkstra简介:荷兰计算机科学家,1972年获图灵奖。
主要贡献:
- dijkstra最短路算法(贪心思想)
- 信号量机制,PV元语
- 银行家算法(死锁)
- 提出“goto有害论”
- 第一个Algol 60编译器的设计者和实现者
- THE操作系统的设计者和开发者
OK! 进入正题!!!!!!!
Dijjkstra算法是单源最短路算法,即某个点到其他所有点的最短路。在该算法中,边的权值不能为负数,适用于有向图和无向图。主要是运用贪心的思想,选择距离原点最近的点松弛源点到其他点的距离。算法步骤如下:
- 给定任意顶点A。设定两个集合U和S, S中为已经访问过的顶点,初始S={A},U为未访问过的顶点。dis[i]为A到i点的最短距离。m[i][j] 为顶点 i 到顶点j的距离。
- 更新集合U,S以及dis[]。在集合U中找出距离A最近的顶点N并标记。同时,对于任意顶点i,若dis[i]>dis[N]+m[N][i]。则dis[i]=dis[N]+m[N][i]。
- 重复上一步骤,直到集合U为空,此时div[i]即为顶点A到顶点i的最小值。
图解更直观哦!!!!!!!!
下图转自博客https://blog.csdn.net/lbperfect123/article/details/84281300
弱智代码:
#include <iostream>
#include <algorithm>
#include<vector>
#define inf 0X3fffffff//不要使用7ffffffff,+1为负数。
using namespace std;
void dijkstra(vector<int> &dis, vector<bool> &visited, vector<vector<int>> m,int N)
{
int i, j, k;
for (i = 1; i < N; i++)
{
int u;
int minu = inf;
for (j = 0; j < N; j++)
{
if (visited[j] == false)
{
if (dis[j] < minu)
{
minu = dis[j];
u = j;
}
}
}
visited[u] = true;
//更新dis
for (j = 0; j < N; j++)
{
if (dis[j] > dis[u] + m[u][j]&& m[u][j]!=inf)
{
dis[j] = dis[u] + m[u][j];
}
}
}
}
int main()
{
int N, M,c1,c2;
cin >> N >> M>>c1>>c2;
vector<bool>visited(N);
vector<int>dis(N);
int i, j, k;
vector<vector<int>> m(N);
fill(visited.begin(), visited.end(), false);
visited[c1] = true;
for (i = 0; i < N; i++)
{
m[i].resize(N);
fill(m[i].begin(), m[i].end(), inf);
m[i][i] = 0;
}
int a, b, c;
for (i = 0; i < M; i++)
{
cin >> a >> b >> c;
m[a][b] = m[b][a] = c;
}
for (i = 0; i < N; i++)
{
dis[i] = m[c1][i];
}
dijkstra(dis, visited, m, N);
cout << dis[c2];
return 0;
}
测试样例:
5 6 0 2
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1