比赛 寒假集训5 评测结果 AAAAAATATAEEEEEEEEEE
题目名称 魔法森林 最终得分 40
用户昵称 exil 运行时间 8.253 s
代码语言 C++ 内存使用 5.38 MiB
提交时间 2026-03-01 11:40:18
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct node {
    int l;
    int r;
    int a;
    int b;
}shu[100005];

vector<pair<int,int>> g[5005];
int dis[5005];
bool vis[5005];
bool cmp(node x, node y) {
    return x.a < y.a;
}
int n,m;
int spfa() {
memset(vis,0,sizeof(vis));


    memset(dis,0x3f,sizeof(dis));
    
    
    
    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];
}

signed main() {
    freopen("magicalforest.in", "r", stdin);
    freopen("magicalforest.out", "w", stdout);
    scanf("%lld%lld",&n,&m);
    for (int i = 1; i <= m; ++i) {
        scanf("%lld%lld%lld%lld",&shu[i].l,&shu[i].r,&shu[i].a,&shu[i].b);
    }
    sort(shu+1,shu+m+1,cmp);
    int ans = INT_MAX;
    for (int i = 1; i <= m; ++i) {
        g[shu[i].l].push_back({shu[i].r, shu[i].b});
        g[shu[i].r].push_back({shu[i].l, shu[i].b});
        int mx = spfa();
        if (mx != INT_MAX) {
            ans = min(ans, shu[i].a+mx);
        }
    }
    if (ans == INT_MAX) {
        cout<<-1<<endl;
    } 
    else {
        cout<<ans<<endl;
    }
    return 0;
}