迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。
它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
详细算法原理实现参考博客:数据结构–Dijkstra算法最清楚的讲解
代码实现:
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
int dis[N]; // 存两点之间的距离
bool via[N]; // 用于标记该点是否已经找到最短路
int n, m, a, b;
struct node //结构体存边以及边的权值
{
int to;
int dis;
friend bool operator<(node n1, node n2) //重载运算
{
return n1.dis > n2.dis;
}
};
vector<node> vec[N]; //用邻接表方式存边,若边较少可使用邻接矩阵存边
priority_queue<struct node> q; //用优先队列实现可降低时间复杂度,其他方式自行百度。
int dijstra(int start, int end)
{
memset(via, false, sizeof(via));
dis[start] = 0;
node ttt;
ttt.to = start;
ttt.dis = 0;
q.push(ttt);
while (!q.empty())
{
node now = q.top();
q.pop();
if (!via[now.to])
{
via[now.to] = true;
for (int i = 0; i < vec[now.to].size(); i++)
{
int to = vec[now.to][i].to;
int cost = vec[now.to][i].dis + dis[now.to];
if (cost < dis[to])
{
dis[to] = cost;
node ttt;
ttt.to = to;
ttt.dis = cost;
q.push(ttt);
}
}
}
}
return dis[end];
}
void init()
{
for (int i = 1; i <= n; i++)
{
dis[i] = INF;
vec[i].clear();
}
}
int main()
{
cout << "输入点的个数和边的个数:" << endl;
cin >> n >> m ;
cout << "输入要求的两点之间的最短距离:" << endl;
init(); //初始化vector
cin >> a >> b;
cout << "输入边以及边的权值:" << endl;
for (int i = 1; i <= m; i++)
{
int u, v, l;
cin >> u >> v >> l;
node ttt;
ttt.dis = l;
ttt.to = v;
vec[u].push_back(ttt);
}
if (dijstra(a, b) == INF)
cout << "-1" << endl;
else
cout << dijstra(a, b) << endl;
return 0;
}
对有向图求最短路,若存在最短路,则输出最短路径长度,若不存在,则输出-1;
例如:求如图所示有向图,求任意两点间的最短路径。
样例中求1-5之间的最短路径,可知最短路径为1-2-4-5,最短路为4。
其他样例自测
hahahaha)