比赛 寒假集训5 评测结果 AAAAAATATAEEEEEEEEEE
题目名称 魔法森林 最终得分 40
用户昵称 dbk 运行时间 8.391 s
代码语言 C++ 内存使用 4.56 MiB
提交时间 2026-03-01 11:21:53
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 5005, M = 100005;
const int INF = 0x3f3f3f3f;
struct node {
    int x, y, a, b;
} e[M];
int n, m;
vector<pair<int, int> > g[N];
int dis[N];
bool vis[N];
bool cmp(node x, node y) {
    return x.a < y.a;
}
int spfa() {
    memset(dis, 0x3f, sizeof(dis));
    memset(vis, false, sizeof(vis));
    queue<int> q;
    dis[1] = 0;
    q.push(1);
    vis[1] = true;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        vis[u] = false;
        for (auto &p : g[u]) {
            int v = p.first, b = p.second;
            int ndis = max(dis[u], b);
            if (ndis < dis[v]) {
                dis[v] = ndis;
                if (!vis[v]) {
                    q.push(v);
                    vis[v] = true;
                }
            }
        }
    }
    return dis[n];
}

int main() {
    freopen("magicalforest.in", "r", stdin);
    freopen("magicalforest.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= m; ++i) {
        scanf("%d %d %d %d", &e[i].x, &e[i].y, &e[i].a, &e[i].b);
    }
    sort(e + 1, e + m + 1, cmp);
    int ans = INF;
    for (int i = 1; i <= m; ++i) {
        g[e[i].x].push_back({e[i].y, e[i].b});
        g[e[i].y].push_back({e[i].x, e[i].b});
        int mxb = spfa();
        if (mxb != INF) {
            ans = min(ans, e[i].a + mxb);
        }
    }
    if (ans == INF) {
        printf("-1\n");
    } 
    else {
        printf("%d\n", ans);
    }
    return 0;
}