题目链接
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的代码与数据结构课程的思路对应上就可以理解一些了。
要是早点学到就可以帮别人代做数据结构大作业了(瘫)