社区讨论
为什么Djkstra堆优化了还是50分5个点TLE
P1119灾后重建参与者 4已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mi6m3poo
- 此快照首次捕获于
- 2025/11/20 07:06 4 个月前
- 此快照最后确认于
- 2025/11/20 07:06 4 个月前
CPP
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstring>
#define MAX_N 5000
#define INF 2147483647
using namespace std;
struct Edge {
int from, to, dist;
Edge(int u, int v, int w) : from(u), to(v), dist(w) {}
};
struct HeapNode {
int d, u;
bool operator < (const HeapNode& rhs) const {
return d > rhs.d;
}
};
struct Djkstra {
int n, m; // point num:n, edge num: m
vector<Edge> edges; // the detail information
vector<int> G[MAX_N]; // the serial number number of every edge
bool done[MAX_N];
int d[MAX_N]; // every distance from u
int p[MAX_N]; // arc of the graph
vector<int> t;
void init (int n) {
this->n = n;
for (int i = 0;i < n; i++) G[i].clear();
edges.clear();
}
void AddEdge (int from, int to, int dist) {
edges.push_back(Edge(from, to, dist));
int ml = edges.size();
G[from].push_back(ml - 1);
return;
}
void AddTime (int time) {
t.push_back(time);
}
int find (int s, int r, int tl) {
if(t[s] > tl || t[r] > tl) return -1;
priority_queue<HeapNode> Q;
for(int i = 0;i < n; i++) d[i] = INF;
d[s] = 0;
memset(done, 0, sizeof(done));
Q.push((HeapNode){0, s});
while (!Q.empty()) {
HeapNode x = Q.top();Q.pop();
int u = x.u;
if(done[u]) continue;
done[u] = true;
for(int i = 0;i < G[u].size(); i++) {
Edge& e = edges[G[u][i]];
if(tl < t[e.from] || tl < t[e.to]) continue;
if(d[e.to] > d[u] + e.dist) {
d[e.to] = d[u] + e.dist;
Q.push((HeapNode){d[e.to], e.to});
}
}
}
if(d[r] == INF) return -1;
return d[r];
}
};
int res[MAX_N];
int main() {
freopen ("input.in", "r", stdin);
Djkstra p;
scanf("%d%d", &p.n, &p.m);
int t;
for(int i = 0;i < p.n; i++) {
scanf("%d", &t);
p.AddTime(t);
}
int from, to, dist;
for(int i = 0;i < p.m; i++) {
scanf("%d%d%d", &from, &to, &dist);
p.AddEdge(from, to, dist);
p.AddEdge(to, from, dist);
}
int q;
scanf("%d", &q);
int top = 0, x, y, tl;
for(int i = 0;i < q; i++) {
scanf("%d%d%d", &x, &y, &tl);
res[top++] = p.find(x, y, tl);
}
for(int i = 0;i < top; i++) printf("%d\n", res[i]);
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...