QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#283972 | #7883. Takeout Delivering | ContrisElikemouthing# | ML | 0ms | 0kb | C++20 | 3.1kb | 2023-12-15 19:49:34 | 2023-12-15 19:49:34 |
answer
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=4e6+10;
int fa[maxn];
inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
struct edge{int u,v,w;}E[maxn];
vector< pair<int,int> > G[maxn];
int n,m;
int lk1[maxn],lkn[maxn];
int nxt[maxn],tot,id[maxn];
int head[maxn],tail[maxn];
priority_queue< pair<int,int> > q;
vector<int> vect[maxn];
int tmin[maxn];
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++)
{
cin>>E[i].u>>E[i].v>>E[i].w;
if(E[i].u>E[i].v)swap(E[i].u,E[i].v);
}
sort(E+1,E+1+m,[&](edge a,edge b){return a.w<b.w;});
for(int i=1;i<=m;i++)lk1[i]=lkn[i]=-1;
for(int i=1;i<=m;i++)
{
int u=E[i].u,v=E[i].v;
++tot;id[tot]=i;nxt[tot]=head[v];
if(!head[v])tail[v]=tot;
head[v]=tot;
++tot;id[tot]=i;nxt[tot]=head[u];
if(!head[u])tail[u]=tot;
head[u]=tot;
}
for(int t=head[1];t;t=nxt[t])
if(lk1[id[t]]==-1)lk1[id[t]]=1;
for(int i=1;i<=m;i++)
{
int u=E[i].u,v=E[i].v,w=E[i].w;
if(find(u)==find(v))continue;
u=find(u),v=find(v);
fa[v]=u;
if(u==1)
{
for(int t=head[v];t;t=nxt[t])
if(lk1[id[t]]==-1)lk1[id[t]]=i;
}
else
{
if(!head[u])head[u]=head[v],tail[u]=tail[v];
else
{
nxt[tail[u]]=head[v];
tail[u]=tail[v];
}
}
}
for(int i=1;i<=n;i++)fa[i]=i,head[i]=tail[i]=0;
for(int i=1;i<=m;i++)swap(E[i].u,E[i].v);
tot=0;
for(int i=1;i<=m;i++)
{
int u=E[i].u,v=E[i].v;
++tot;id[tot]=i;nxt[tot]=head[v];
if(!head[v])tail[v]=tot;
head[v]=tot;
++tot;id[tot]=i;nxt[tot]=head[u];
if(!head[u])tail[u]=tot;
head[u]=tot;
}
for(int t=head[n];t;t=nxt[t])
if(lkn[id[t]]==-1)lkn[id[t]]=1;
for(int i=1;i<=m;i++)
{
int u=E[i].u,v=E[i].v,w=E[i].w;
if(find(u)==find(v))continue;
u=find(u),v=find(v);
fa[v]=u;
if(u==n)
{
for(int t=head[v];t;t=nxt[t])
if(lkn[id[t]]==-1)lkn[id[t]]=i;
}
else
{
if(!head[u])head[u]=head[v],tail[u]=tail[v];
else
{
nxt[tail[u]]=head[v];
tail[u]=tail[v];
}
}
}
for(int i=1;i<=m;i++)
if(lk1[i]!=-1&&lkn[i]!=-1)
tmin[i]=max(lk1[i],lkn[i]),vect[tmin[i]].push_back(i);
int Ans=1e9;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++)
{
int u=E[i].u,v=E[i].v;
fa[find(v)]=find(u);
for(int id:vect[i])q.push({-E[id].w,id});
while(q.size())
{
int id=q.top().second;
int u=E[id].u,v=E[id].v;
if(find(u)==find(v))q.pop();
else
{
Ans=min(Ans,E[i].w+E[id].w);
break;
}
}
}
cout<<Ans<<'\n';
}
详细
Test #1:
score: 0
Memory Limit Exceeded
input:
4 6 1 2 2 1 3 4 1 4 7 2 3 1 2 4 3 3 4 9
output:
5