比赛 寒假集训5 评测结果 WAAAAATTTTAAAATTTTTT
题目名称 魔法森林 最终得分 45
用户昵称 123 运行时间 23.562 s
代码语言 C++ 内存使用 7.29 MiB
提交时间 2026-03-01 10:09:39
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+10,M=1e5+10,inf=0x3f3f3f3f;
int n,m,d[M],c[M],tot1=0,tot2=0,dis[N],vis[N];
struct node {
    int idx,a,b;
};
vector<node> v[N];
queue<int> q;
void read(int &x)
{
    int cnt=0;
    char c=getchar();
    while (!('0'<=c && c<='9')) c=getchar();
    while ('0'<=c && c<='9') cnt=(cnt<<1)+(cnt<<3)+c-'0',c=getchar();
    x=cnt;
}
int cmp(node x,node y)
{
    return x.a<y.a;
}
int check(int l,int r)
{
    for (int i=1;i<=n;i++) dis[i]=inf,vis[i]=0;
    while (!q.empty()) q.pop();
    q.push(1);vis[1]=1;
    while (!q.empty())
    {
        int t=q.front();q.pop();
        for (auto i:v[t])
        {
            if (i.a>l) break;
            if (i.b>r) continue;
            int y=i.idx;
            if (y==n) return 1;
            if (!vis[y])
            {
                vis[y]=1;
                q.push(y);
            }
        }
    }
    return 0;
}
int main() {
    freopen("magicalforest.in","r",stdin);
    freopen("magicalforest.out","w",stdout);
    read(n),read(m);
    while (m--)
    {
        int x,y,a,b;
        read(x),read(y),read(a),read(b);
        v[x].push_back({y,a,b}),v[y].push_back({x,a,b});
        c[++tot1]=a,d[++tot2]=b;
    }
    for (int i=1;i<=n;i++) sort(v[i].begin(),v[i].end(),cmp);
    sort(c+1,c+tot1+1),tot1=unique(c+1,c+tot1+1)-c-1;
    sort(d+1,d+tot2+1),tot2=unique(d+1,d+tot2+1)-d-1;
    for (int i=1;i<=n;i++)
    {
        for (int j=0;j<v[i].size();j++)
        {
            v[i][j].a=lower_bound(c+1,c+tot1+1,v[i][j].a)-c,v[i][j].b=lower_bound(d+1,d+tot2+1,v[i][j].b)-d;
        }
    }
    int ans=1e9;
    for (int i=1;i<=tot1;i++)
    {
        int l=1,r=tot2+1;
        while (l<r)
        {
            int mid=l+r>>1;
            if (check(i,mid)) r=mid;
            else l=mid+1;
        }
        if (r<tot2) ans=min(ans,c[i]+d[r]);
    }
    cout<<ans;
}