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