题解 | #【模板】单源最短路1#

【模板】单源最短路1

https://www.nowcoder.com/practice/f24504c9ff544f7c808f76693cc34af8

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
using namespace std;

//采用spfa算法

const int N = 5010, M = 10e5 + 10;
int h[N], e[M], ne[M], idx, n, m;
int dist[N], que[N], hh, tt;

void add(int a, int b) {
	e[idx] = b;
	ne[idx] = h[a];
	h[a] = idx++;
}

int spfa() {
	dist[1] = 0;
	que[tt++] = 1;
	while (hh <= tt) {
		int t = que[hh++];	//取出队头元素
		for (int i = h[t];i != -1;i = ne[i]) {
			int j = e[i];
			if (dist[j] > dist[t] + 1) {
				dist[j] = dist[t] + 1;
				que[tt++] = j;
			}
		}
	}
	if (dist[n] == 0x3f3f3f3f)
		return -1;
	else
		return dist[n];
}


int main() {
	memset(h, -1, sizeof h);
	memset(dist, 0x3f, sizeof dist);
	cin >> n >> m;
	while (m--) {
		int u, v;
		cin >> u >> v;
		if (u == v)
			continue;
		add(u, v), add(v, u);
	}
	int t = spfa();
	if (t == 0x3f3f3f3f)
		printf("-1\n");
	else
		printf("%d\n", t);
	return 0;
}

由于本题不存在负环边,可以采用spfa算法,时间复杂度为 O(m).

spfa算法对bellmen_ford算法进行了优化,其基本思路是:

定义队列存储等待用于更新dist[i]的顶点,每一次都从队列中选取出一个顶点v,用以更新起点到达v的邻接点的最短距离。倘若u为v的邻接点,当dist[u]>dist[v]+1时,dist[u] = dist[v]+1,并且u加入队列。对于满足dist[u]==dist[v]+1的顶点u,由于无需考虑将u加入到队列。

全部评论

相关推荐

05-07 17:58
门头沟学院 Java
wuwuwuoow:1.简历字体有些怪怪的,用啥写的? 2.Redis 一主二从为什么能解决双写一致性? 3.乐观锁指的是 SQL 层面的库存判断?比如 stock > 0。个人认为这种不算乐观锁,更像是乐观锁的思想,写 SQL 避免不了悲观锁的 4.奖项证书如果不是 ACM,说实话没什么必要写 5.逻辑过期时间为什么能解决缓存击穿问题?逻辑过期指的是什么 其实也没什么多大要改的。海投吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务