Acwing 849.Dijistra求最短路径(朴素Dijistra算法)
题目链接
https://www.acwing.com/problem/content/851/
思路
迪杰斯特拉。我自己讲不明白,如图。
从v0开始看,找到能到达的所有点的路径,前提是将不能到的所有点设置为无穷大。
找到一个最短路。将坐标移到下一个,图上是移到了v2,
从v2开始看,用v2到所有点的路径加上v0到v2的路径,并且更新距离。
具体代码实现则是维护dist数组,记录到每个点的最小路径。
AC模板代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 502;
int n, m;
int g[N][N]; //存储每条边
int dist[N]; //存储一号点到每个点的最短距离
bool st[N]; //存储每个点的最短路径是否已经确定
int dijkstra()
{
memset(dist, 0x3f, sizeof dist);//将所有距离标为正无穷
dist[1] = 0;
for(int i=0;i<n-1;i++)
{
int t = -1; //在还未确定最短路的点中,寻找距离最小的点
for(int j=1;j<=n;j++)
{
if (!st[j] && (t == -1 || dist[t] > dist[j]))
t = j;
}
//用t更新其他点的距离
for(int j=1;j<=n;j++)
{
dist[j] = min(dist[j], dist[t] + g[t][j]);
}
st[t] = true;
}
if (dist[n] == 0x3f3f3f3f)
return -1;
return dist[n];
}
int main(int argc, char* argv[])
{
cin >> n >> m;
memset(g, 0x3f, sizeof(g));
while (m--)
{
int a, b, c;
cin >> a >> b >> c;
g[a][b] = min(g[a][b], c);
}
cout << dijkstra();
}
心得
我以为这玩意儿很难,要设计递归啥的,结果实现出来也就那么一回事。很多算法课程和书籍将它复杂化。看到yxc的代码与数据结构课程的思路对应上就可以理解一些了。
要是早点学到就可以帮别人代做数据结构大作业了(瘫)
分类:
算法题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~