比赛 寒假集训2 评测结果 WWWWWWWWWWWWWWAAAAAA
题目名称 回家路线 最终得分 30
用户昵称 LikableP 运行时间 0.610 s
代码语言 C++ 内存使用 6.65 MiB
提交时间 2026-02-25 11:30:02
显示代码纯文本
#include <cstdio>
#include <queue>
#include <cstring>
typedef long long ll;

const int MAXN = 1e5 + 10;
const int MAXM = 2e5 + 10;

struct EDGE {
  int v, next, st, ed;
} edge[MAXM];

int head[MAXN], edgeNum;
void AddEdge(int u, int v, int st, int ed) {
  edge[++edgeNum] = {v, head[u], st, ed};
  head[u] = edgeNum;
}

int n, m;
ll A, B, C;

int dis[MAXN], vis[MAXN], path[MAXN], choose[MAXN];
std::priority_queue<std::pair<int, int>> pq;
void Dijkstra() {
  memset(dis, 0x3f, sizeof(dis));
  dis[1] = 0;
  pq.emplace(-dis[1], 1);
  while (!pq.empty()) {
    int u = pq.top().second;
    pq.pop();

    if (vis[u]) continue;
    vis[u] = 1;

    for (int i = head[u]; i; i = edge[i].next) if (dis[u] <= edge[i].st) {
      int v = edge[i].v;
      if (dis[v] > edge[i].ed) {
        dis[v] = edge[i].ed;
        path[v] = u;
        choose[v] = i;
        pq.emplace(-dis[v], v);
      }
    }
  }
}

int GetPathLen(int u) {
  if (path[u]) return GetPathLen(path[u]) + 1;
  return 0;
}

int x[MAXM], y[MAXM], p[MAXM], q[MAXM];

int main() {
  #ifdef LOCAL
    freopen("!input.in", "r", stdin);
    freopen("!output.out", "w", stdout);
  #else
    freopen("rout.in", "r", stdin);
    freopen("rout.out", "w", stdout);
  #endif

  scanf("%d %d %lld %lld %lld", &n, &m, &A, &B, &C);
  for (int i = 1; i <= m; ++i) {
    scanf("%d %d %d %d", &x[i], &y[i], &p[i], &q[i]);
    AddEdge(x[i], y[i], p[i], q[i]);
  }

  Dijkstra();

  long long ans = q[choose[n]];
  if (C) {
    ans += C + GetPathLen(n) * C;
  }

  printf("%lld\n", ans);
  return 0;
}