专栏文章
题解:AT_abc417_e [ABC417E] A Path in A Dictionary
AT_abc417_e题解参与者 5已保存评论 4
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @miok2bi9
- 此快照首次捕获于
- 2025/12/02 20:29 3 个月前
- 此快照最后确认于
- 2025/12/02 20:29 3 个月前
说在前面
前置芝士:最短路。
题目分析
其实这是一道很简单的题,vector 是可以支持大小的比较的,即字典序。
于是我们把 dijkstra 的松弛操作改为 vector 的比较即可。用 数组存下路径。
我们每一步走的都是当前的最优路径,那么答案一定也是最优的。
完整代码
CPP#include <bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
namespace zcq_qwq {
const int N = 1000 + 5, M = 50000 + 5;
int h[N], to[M << 1], nxt[M << 1];
vector<int> d[N];
bool vis[N];
int t, n, m, tot, s, ed;
void add(int a, int b) {
to[tot] = b;
nxt[tot] = h[a];
h[a] = tot++;
}
struct node {
vector<int> f;
int u;
bool operator < (const node & x) const {
return f > x.f;
}
};
void dijkstra(int st) {
for (int i = 1; i <= n; i++) {
d[i] = {0x3f3f3f3f};
}
memset(vis, 0, sizeof vis);
priority_queue<node> pq;
d[st] = {st};
pq.push({d[st], st});
while (!pq.empty()) {
node u = pq.top();
pq.pop();
if (vis[u.u]) continue;
vis[u.u] = true;
for (int i = h[u.u]; ~i; i = nxt[i]) {
int j = to[i];
vector<int> vec;
vec = d[u.u];
vec.push_back(j);
if (d[j] > vec) {
d[j] = vec;
pq.push({d[j], j});
}
}
}
}
void solve() {
memset(h, -1, sizeof h);
memset(to, 0, sizeof to);
memset(nxt, 0, sizeof nxt);
tot = 0;
cin >> n >> m >> s >> ed;
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
add(u, v);
add(v, u);
}
dijkstra(s);
for (auto i : d[ed]) {
cout << i << " ";
}
cout << endl;
}
void main() {
cin >> t;
while (t--) {
solve();
}
}
}
signed main() {
zcq_qwq::main();
return 0;
}
说在后面
若代码、思路讲解有误,欢迎提出!
相关推荐
评论
共 4 条评论,欢迎与作者交流。
正在加载评论...