QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#283972#7883. Takeout DeliveringContrisElikemouthing#ML 0ms0kbC++203.1kb2023-12-15 19:49:342023-12-15 19:49:34

Judging History

你现在查看的是最新测评结果

  • [2023-12-15 19:49:34]
  • 评测
  • 测评结果:ML
  • 用时:0ms
  • 内存:0kb
  • [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

result: