社区讨论
100求调!
P2483【模板】k 短路 / [SDOI2010] 魔法猪学院参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhju13t5
- 此快照首次捕获于
- 2025/11/04 08:30 4 个月前
- 此快照最后确认于
- 2025/11/04 08:30 4 个月前
明明都100了却MLE两个!
CPP#include <bits/stdc++.h>
using namespace std;
typedef pair<int, double> pid;
typedef pair<double, int> pdi;
const double INF = 1e18;
int N, M,cnt[5005];
vector<pid> adj[5005], rev_adj[5005];
double dist[5005],E;
void dijkstra(int start) {
priority_queue<pdi, vector<pdi>, greater<pdi>> pq;
fill(dist, dist + N + 1, INF);
dist[start] = 0;
pq.push({0, start});
while (!pq.empty()) {
double d = pq.top().first;
int u = pq.top().second;
pq.pop();
if (d > dist[u]) continue;
for (auto &edge : rev_adj[u]) {
int v = edge.first;
double w = edge.second;
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.push({dist[v], v});
}
}
}
}
int astar() {
priority_queue<pdi, vector<pdi>, greater<pdi>> pq;
pq.push({dist[1], 1});
int ans = 0;
double total = 0;
while (!pq.empty()) {
double cost = pq.top().first;
int u = pq.top().second;
pq.pop();
if (u == N) {
if (total + (cost - dist[N]) > E + 1e-8) {
break;
}
total += cost - dist[N];
ans++;
if (total >= E - 1e-8) {
break;
}
continue;
}
if (cnt[u]++ > E) continue;
for (auto &edge : adj[u]) {
int v = edge.first;
double w = edge.second;
pq.push({cost - dist[u] + w + dist[v], v});
}
}
return ans;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M >> E;
for (int i = 0; i < M; ++i) {
int s, t;
double e;
cin >> s >> t >> e;
adj[s].emplace_back(t, e);
rev_adj[t].emplace_back(s, e);
}
dijkstra(N);
cout << astar() << endl;
return 0;
}
有没有改一下的
回复
共 3 条回复,欢迎继续交流。
正在加载回复...