社区讨论
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 条回复,欢迎继续交流。
正在加载回复...