| 比赛 |
寒假集训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;
}