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