社区讨论

为什么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 条回复,欢迎继续交流。

正在加载回复...