| 比赛 |
寒假集训5 |
评测结果 |
AWAAAAAAAAAAAAAAAAAW |
| 题目名称 |
魔法森林 |
最终得分 |
90 |
| 用户昵称 |
赵飞羽 |
运行时间 |
5.362 s |
| 代码语言 |
C++ |
内存使用 |
4.70 MiB |
| 提交时间 |
2026-03-01 09:49:31 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 50010, M = 100010, INF = 1e9;
int n, m, siz[N], fa[N], mxa, mxb, ans = INF;
struct node{
int u, v, a, b;
} g[M];
int _find(int x) {
if (fa[x] == x) return x;
fa[x] = _find(fa[x]);
return fa[x];
}
void merge(int x, int y) {
x = _find(x), y = _find(y);
if (x == y) return;
if (siz[x] < siz[y]) swap(x, y);
fa[y] = x;
siz[x] += siz[y];
return;
}
bool check(int x, int y) {
for (int i = 1; i <= n; i++) fa[i] = i;
for (int i = 1; i <= m; i++) if (g[i].a <= x && g[i].b <= y) merge(g[i].u, g[i].v);
if (_find(1) == _find(n)) return ans = min(ans, x + y);
return false;
}
signed main() {
freopen("magicalforest.in", "r", stdin);
freopen("magicalforest.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> g[i].u >> g[i].v >> g[i].a >> g[i].b;
mxa = max(mxa, g[i].a);
mxb = max(mxb, g[i].b);
}
int lb = 0, rb = mxb + 1;
while (lb < rb) {
int midb = (lb + rb) / 2;
int la = 0, ra = mxa + 1;
while (la < ra) {
int mida = (la + ra) / 2;
if (check(mida, midb)) ra = mida;
else la = mida + 1;
}
if (check(la, midb)) rb = midb;
else lb = midb + 1;
}
cout << (ans == INF? -1: ans);
return 0;
}