Acwing 849.Dijistra求最短路径(朴素Dijistra算法)

题目链接

https://www.acwing.com/problem/content/851/

思路

迪杰斯特拉。我自己讲不明白,如图。
image

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

posted @ 2022-01-21 20:52  张牧歌  阅读(83)  评论(1编辑  收藏  举报