*玄关*样例过不了求调
查看原帖
*玄关*样例过不了求调
1399216
_Gloaming_楼主2024/8/28 21:37
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,inf=1e9;
#define ll long long
struct node
{
    int u,v;
    ll w;
}e[N],ed[N];
int h[N*3],cnt=0,n,m,par[N],dep[N];
int f[N][20],fc[N][20],fm[N][20];
ll sum,ans=inf;
bool cmp(node a,node b)
{
    return a.w>b.w;
}
int find(int x)
{
    if(x==par[x])
        return par[x];
    else
    {
        par[x]=find(par[x]);
        return par[x];
    }
}
void add(int u,int v,int w)
{
    cnt++;
    e[cnt].v=v;
    e[cnt].w=w;
    e[cnt].u=h[u];
    h[u]=cnt;
}
void dfs(int x,int fa,int w)
{ 
    dep[x]=dep[fa]+1;
    f[x][0]=fa;
    fm[x][0]=w;
    fc[x][0]=0;
    for(int i=1;i<=20;i++)
    {
        f[x][i]=f[f[x][i-1]][i-1];
        fm[x][i]=max(fm[f[x][i-1]][i-1],fm[x][i-1]);
        fc[x][i]=max(fc[f[x][i-1]][i-1],fc[x][i-1]);
        if(fm[f[x][i-1]][i-1]>fm[x][i-1])
            fc[x][i]=max(fc[x][i],fm[x][i-1]);
        else if(fm[f[x][i-1]][i-1]<fm[x][i-1])
            fc[x][i]=max(fc[x][i],fm[fm[x][i-1]][i-1]);
    }
    for(int i=h[x];i;i=e[i].u)
    {
        int v=e[i].v;
        if(v==fa)
            continue;
        int w=e[i].w;
        dfs(v,x,w);
    }
}
void kru()
{
    int tot=0;
    for(int i=1;i<=n;i++)
        par[i]=i;
    sort(ed+1,ed+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        
        int x=find(ed[i].u);
        int y=find(ed[i].v);
        if(x!=y)
        {
            par[x]=y;
            sum+=ed[i].w;
            add(ed[i].u,ed[i].v,ed[i].w);
            add(ed[i].v,ed[i].u,ed[i].w);
            ++tot;
        }
        if(tot==n-1)
                break;
    }
    dfs(1,0,0);
}
int LCA(int a,int b)
{
    int ans;
    if(dep[a]<dep[b])
        swap(a,b);
    while(dep[a]>dep[b])
    {
        int k=log2(dep[a]-dep[b]);
        a=f[a][k];
    }
    if(a==b)
        return a;
    for(int i=log2(dep[a])+1;i>=0;i--)
    {
        if(f[a][i]!=f[b][i])
        {
            a=f[a][i];
            b=f[b][i];
        }
    }
    return f[a][0];
}
int query(int u,int v,int w)
{
    int ans=-inf;
    for(int i=log2(dep[u]);i>=0;i--)
    {
        if(dep[f[u][i]]>=dep[v])
        {
            if(w!=fm[u][i])
                ans=max(ans,fm[u][i]);
            else
                ans=max(ans,fc[u][i]);
            u=f[u][i];
        }
    }
    return ans;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
        cin>>ed[i].u>>ed[i].v>>ed[i].w;
    kru();
    for(int i=1;i<=m;i++)
    {
        int lca=LCA(ed[i].u,ed[i].v);
        int mu=query(ed[i].u,lca,ed[i].w);
        int mv=query(ed[i].v,lca,ed[i].w);
        ans=min(ans,sum-max(mu,mv)+ed[i].w);
    }
    cout<<ans;
    return 0;
} 
2024/8/28 21:37
加载中...