kruskal+lca 90pts WA#1 #3求助
查看原帖
kruskal+lca 90pts WA#1 #3求助
169953
liujunhongljh楼主2022/11/16 20:59
#include<bits/stdc++.h>
#define MAXN 100007
#define MAXM 300007
using namespace std;
struct ed{
    int nxt,to,val;
}e[MAXN<<1];
int h[MAXN],cnt,n,m,fa[MAXN];
long long ans0;
void add(int u,int v,int w)
{
    e[++cnt].nxt=h[u];
    e[cnt].to=v;
    e[cnt].val=w;
    h[u]=cnt;
}
struct ed1{
    int u,v,w;
    bool used;
}e1[MAXM];
bool cmp(ed1 a,ed1 b)
{
    return a.w<b.w;
}
int find1(int x)
{
    if(x!=fa[x])
        return fa[x]=find1(fa[x]);
}
void kruskal()
{

    sort(e1+1,e1+m+1,cmp);
    for(int i=1;i<=m;i++){
        int u=find1(e1[i].u),v=find1(e1[i].v);
        if(u==v)
            continue;
        ans0+=e1[i].w;
        add(e1[i].u,e1[i].v,e1[i].w);
        add(e1[i].v,e1[i].u,e1[i].w);
        e1[i].used=1;
        fa[v]=u;
    }
}
int f[MAXN][20],mx[MAXN][20],mx2[MAXN][20],dep[MAXN];
void dfs(int u)
{
    dep[u]=dep[f[u][0]]+1;
    for(int i=1;i<=18;i++)
    {
        f[u][i]=f[f[u][i-1]][i-1];
        if(mx[u][i-1]==mx[f[u][i-1]][i-1])
        {
            mx[u][i]=mx[u][i-1];
            mx2[u][i]=max(mx2[f[u][i-1]][i-1],mx2[u][i-1]);
        }
        if(mx[u][i-1]>mx[f[u][i-1]][i-1])
        {
            mx[u][i]=mx[u][i-1];
            mx2[u][i]=max(mx[f[u][i-1]][i-1],mx2[u][i-1]);
        }
        if(mx[u][i-1]<mx[f[u][i-1]][i-1])
        {
            mx[u][i]=mx[f[u][i-1]][i-1];
            mx2[u][i]=max(mx2[f[u][i-1]][i-1],mx[u][i-1]);
        }
    }
    for(int i=h[u];i;i=e[i].nxt)
    {
        int v=e[i].to,w=e[i].val;
        if(v==f[u][0])  continue;
        f[v][0]=u;mx[v][0]=w;
        dfs(v);
    }
}
int lca(int u,int v)
{
    if(dep[u]<dep[v]) swap(u,v);
    for(int i=18;i>=0;i--)
        if(dep[u]-dep[v]>=(1<<i))
            u=f[u][i];
    if(u==v)  return u;
    for(int i=18;i>=0;i--)
        if(f[u][i]!=f[v][i])
            u=f[u][i],v=f[v][i];
    return f[u][0];
}
long long cal(int u,int v,int w)
{
    int l=lca(u,v),nmx=0,nmx2=0;
    for(int i=18;i>=0;i--){
        if(dep[f[u][i]]>=dep[l])
        {
            if(nmx==mx[u][i]) nmx2=max(mx2[u][i],nmx2);
            if(nmx>mx[u][i]) nmx2=max(mx[u][i],nmx2);
            if(nmx<mx[u][i]) nmx2=max(mx2[u][i],nmx),nmx=mx[u][i];
            u=f[u][i];
        }
        if(dep[f[v][i]]>=dep[l]){
            if(nmx==mx[u][i]) nmx2=max(mx2[v][i],nmx2);
            if(nmx>mx[u][i]) nmx2=max(mx[v][i],nmx2);
            if(nmx<mx[u][i]) nmx2=max(mx2[v][i],nmx),nmx=mx[v][i];
            v=f[u][i];
        }
    }
    if(w!=nmx) return ans0-nmx+w;
    if(nmx2)  return ans0-nmx2+w;
    return 0x7f7f7f7f7f7f7f7f;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
        cin>>e1[i].u>>e1[i].v>>e1[i].w;
    for(int i=1;i<=n;i++)
        fa[i]=i;
    kruskal();
    dfs(1);
    long long  ans= 0x7f7f7f7f7f7f7f7f;
    for(int i=1;i<=m;i++)
        if(!e1[i].used) ans=min(cal(e1[i].u,e1[i].v,e1[i].w),ans);
    cout<<ans;
    return 0;
}
2022/11/16 20:59
加载中...