概述
Dijkstra算法的主要目的:
为了解决最小路径问题。
Dijkstra算法采用一种贪心的策略。声明一个数组dis来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合。
初始时,原点 s 的路径权重被赋为 0 (dis[s] = 0),所有的dis[i]都赋值为无穷。若对于顶点 s 存在能直接到达的边(s,m),则把dis[m]设为w(s, m)
例如这幅图,按照Dijkstra的算法,起始点为v1,先将dis[1]=0,dis[2]=无穷,dis[3]=无穷,dis[4]=无穷,dis[5]=无穷,dis[6]=无穷。然后从v1出发,有v3,v6,更新dis[3]=10,dis[6]=100,dis[5]=30,然后,将v1的flag值置成1,代表已经使用过,然后寻找最小的dis[i],发现是dis[3],从3出发,可以更新dis[4]=min(无穷,dis[3]+dist[3][4])=60,同理可以更新剩余的点,直到每一个点都已经选取过为止。
Dijkstra算法的代码实现:
#include <iostream>
#include <cstdio>
#define MAX 1005
using namespace std;
int n, m, s, t;
int map[MAX][MAX];
int dis[MAX];
int vis[MAX];
int MIN(int x, int y)
{
if (x < y)
return x;
else
return y;
}
void Dijkstra()
{
for (int i = 1; i <= n; i++)
dis[i] = map[s][i];
vis[s] = 1;
dis[s] = 0;
for (int i = 1; i < n; i++)
{
int min = 0x7f7f7f7f;
int pos;
for (int j = 1; j <= n; j++)
{
if (!vis[j] && dis[j] < min)
{
min = dis[j];
pos = j;
}
}
if (min == 0x7f7f7f7f)
break;
for (int j = 1; j <= n; j++)
dis[j] = MIN(dis[j], map[pos][j] + dis[pos]);
vis[pos] = 1;
}
}
int main()
{
scanf("%d %d %d %d", &n, &m, &s, &t);
memset(vis, 0, sizeof(vis));
memset(map, 0x7f7f7f7f, sizeof(map));
while (m--)
{
int x, y, w;
scanf("%d %d %d", &x, &y, &w);
map[x][y] = map[y][x] = MIN(map[x][y], w);
}
Dijkstra();
cout << dis[t] << endl;
return 0;
}
最后
以上就是会撒娇鲜花为你收集整理的菜鸟的ACM学习之路——Dijkstra算法的全部内容,希望文章能够帮你解决菜鸟的ACM学习之路——Dijkstra算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复