社区讨论

dijkstra 与 spfa 都是 40 分,求助

P3371【模板】单源最短路径(弱化版)参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lz6fsyzd
此快照首次捕获于
2024/07/29 11:36
2 年前
此快照最后确认于
2024/07/29 13:17
2 年前
查看原帖
rt.
dijkstra 代码:
CPP
#include <iostream>
using namespace std;
const int inf = 2147483647;
int n, m, s, to[10001], val[10001], nxt[10001], head[10001], dis[10001], cnt;
bool vis[10001];
void add(int a, int b, int c) {
	to[++cnt] = b;
	val[cnt] = c;
	nxt[cnt] = head[a];
	head[a] = cnt;
}
void dijkstra() {
	for (int i = 0; i <= n; ++i) dis[i] = inf;
	dis[s] = 0;
	while (true) {
		int u = 0;
		for (int i = 1; i <= n; ++i) if (!vis[i] && dis[i] < dis[u]) u = i;
		if (u == 0) break;
		vis[u] = true;
		for (int i = head[u]; i; i = nxt[i]) if (dis[to[i]] > dis[u] + val[i]) dis[to[i]] = dis[u] + val[i];
	}
}
signed main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m >> s;
	for (int i = 1; i <= m; ++i) {
		int a, b, c;
		cin >> a >> b >> c;
		add(a, b, c);
	}
	dijkstra();
	for (int i = 1; i <= n; ++i) cout << dis[i] << " ";
	return 0;
}
spfa 代码:
CPP
#include <iostream>
#include <queue>
using namespace std;
const int inf = 2147483647;
int n, m, s, to[10001], val[10001], nxt[10001], head[10001], dis[10001], cnt;
bool vis[10001];
void add(int a, int b, int c) {
	to[++cnt] = b;
	val[cnt] = c;
	nxt[cnt] = head[a];
	head[a] = cnt;
}
void spfa() {
	for (int i = 0; i <= n; ++i) dis[i] = inf;
	dis[s] = 0;
	queue<int>que;
	que.push(s);
	while (!que.empty()) {
		int u = que.front();
		que.pop();
		vis[u] = false;
		for (int i = head[u]; i; i = nxt[i])
			if (dis[to[i]] > dis[u] + val[i]) {
				dis[to[i]] = dis[u] + val[i];
				if (!vis[to[i]]) {
					que.push(to[i]);
					vis[to[i]] = true;
				}
			}
	}
}
signed main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m >> s;
	for (int i = 1; i <= m; ++i) {
		int a, b, c;
		cin >> a >> b >> c;
		add(a, b, c);
	}
	spfa();
	for (int i = 1; i <= n; ++i) cout << dis[i] << " ";
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...