社区讨论
感觉链表前向星好危险,求个hack
P1491集合位置参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhizonx0
- 此快照首次捕获于
- 2025/11/03 18:20 4 个月前
- 此快照最后确认于
- 2025/11/03 18:20 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define f(i, x, y, ...) for (int i = x, ##__VA_ARGS__; i <= y; ++i)
template <class T>
class FS
{
public:
struct Line
{
int u, v;
T w;
Line *next = nullptr, *prev = nullptr;
Line(int U, int V, T W) : u(U), v(V), w(W) {}
};
vector<Line *> head;
public:
FS(size_t sz) : head(sz) {}
void add(int u, int v, T w)
{
Line *newedge = new Line(u, v, w);
if (head[u])head[u]->prev = newedge, newedge->next = head[u];
head[u] = newedge;
}
Line *&operator[](int u)
{
return head[u];
}
};
constexpr int maxn = 1e4 + 5, inf = LLONG_MAX;
vector<pair<int, int>> nodes;
vector<double> dis(maxn, inf);
vector<bool> vis(maxn);
FS<double> head(maxn);
vector<FS<double>::Line *> pre(maxn), path;
int n, m;
double ans = inf;
void dij1()
{
priority_queue<tuple<double, int, int>, vector<tuple<double, int, int>>, greater<tuple<double, int, int>>> q;
q.push({0, 1, 0});
while (q.size())
{
auto [d, u, lst] = q.top();
q.pop();
if (d > dis[u])continue;
dis[u] = d, vis[u] = 1;
for (auto i = head[u]; i; i = i->next)
if (dis[i->v] > dis[u] + i->w)
{
dis[i->v] = dis[u] + i->w;
if (!vis[i->v])
q.push({dis[i->v], i->v, u}), pre[i->v] = i;
}
}
}
void get_path()
{
for (auto i = pre[n]; i; i = pre[i->u])path.push_back(i);
}
double dij2()
{
priority_queue<pair<double, int>, vector<pair<double, int>>, greater<pair<double, int>>> q;
vector<double> dis(n + 1, inf);
vector<bool> vis(n + 1);
q.push({0, 1});
while (q.size())
{
auto [d, u] = q.top();
q.pop();
if (d > dis[u])continue;
dis[u] = d, vis[u] = 1;
for (auto i = head[u]; i; i = i->next)
if (dis[i->v] > dis[u] + i->w)
{
dis[i->v] = dis[u] + i->w;
if (!vis[i->v])
q.push({dis[i->v], i->v});
}
}
return dis[n];
}
signed main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
f(i, 1, n, x, y)cin >> x >> y,nodes.emplace_back(x, y);
f(i, 1, m, p, q)cin >> p >> q,head.add(p, q, sqrt((nodes[p - 1].first - nodes[q - 1].first) * (nodes[p - 1].first - nodes[q - 1].first) + (nodes[p - 1].second - nodes[q - 1].second) * (nodes[p - 1].second - nodes[q - 1].second))),head.add(q, p, sqrt((nodes[p - 1].first - nodes[q - 1].first) * (nodes[p - 1].first - nodes[q - 1].first) + (nodes[p - 1].second - nodes[q - 1].second) * (nodes[p - 1].second - nodes[q - 1].second)));
dij1(),get_path();
for (auto i : path)
{
if (i->prev)i->prev->next = i->next;
if (i->next)i->next->prev = i->prev;
if (head[i->u] == i)head[i->u] = i->next;
ans = min(ans, dij2());
if (i->prev)i->prev->next = i;
if (i->next)i->next->prev = i;
if (head[i->u] == i->next)head[i->u] = i;
}
printf("%.2f", ans);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...