MnZn求助
查看原帖
MnZn求助
604231
dongshucheng楼主2024/9/10 21:53
#include<bits/stdc++.h>
#define int long long
#define maxn 1000050
#define lc rt<<1
#define rc rt<<1|1
#define mod1 998244353
#define mod2 (int)(1e9+7)
#define fq(i,a,b) for(int i=a;i<=b;i++)
#define fp(i,a,b) for(int i=a;i<b;i++)
#define frq(i,a,b) for(int i=a;i>=b;i--)
#define frp(i,a,b) for(int i=a;i>b;i--)
using namespace std;
int qpow(int x,int y,int mod) {
    int ans=1;
    while(y) {
        if(y&1) ans=ans*x%mod;
        x=x*x%mod,y>>=1;
    }
    return ans;
}
int n,m;
struct aa{ int x,y,z; }a[maxn];
struct PP{ int to,w; };
vector<PP> P[maxn];
int inf=1e18;
bool cmp(aa p,aa q) { return p.z<q.z; }
int fa[maxn];
int find(int x) {
    if(fa[x]==x) return x;
    else return fa[x]=find(fa[x]);
}
int res,sum;
bool vis[maxn];
int dep[maxn],f[maxn][35],g[maxn][35];
int h[maxn][35];
void dfs(int x,int fa,int w) {
    dep[x]=dep[fa]+1,f[x][0]=fa,g[x][0]=w,h[x][0]=-inf;
    fq(i,1,20) {
        f[x][i]=f[f[x][i-1]][i-1];
        g[x][i]=max(g[x][i-1],g[f[x][i-1]][i-1]);
        h[x][i]=max(h[x][i-1],g[f[x][i-1]][i-1]);
        if(g[x][i-1]>g[f[x][i-1]][i-1]) h[x][i]=max(h[x][i],g[f[x][i-1]][i-1]);
		else if (g[x][i-1]<g[f[x][i-1]][i-1]) h[x][i]=max(h[x][i],g[x][i-1]);
    }
    for(auto now: P[x]) {
        if(now.to==fa) continue;
        dfs(now.to,x,now.w);
    }
}
int LCA(int x,int y) {
    if(dep[x]<dep[y]) swap(x,y);
    frq(i,20,0) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
    if(x==y) return x;
    frq(i,20,0) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
    return f[x][0];
}
int Q_max(int x,int y,int maxx) {
    int ans=-inf;
    frq(i,18,0) {
        if(dep[f[x][i]]>=dep[y]) {
            if(maxx!=g[x][i]) ans=max(ans,g[x][i]);
            else ans=max(ans,h[x][i]);
            x=f[x][i];
        }
    } return ans;
}
signed main(){
    ios::sync_with_stdio(false);cin.tie(0); cin>>n>>m;
    fq(i,1,m) cin>>a[i].x>>a[i].y>>a[i].z;
    sort(a+1,a+m+1,cmp);
    fq(i,1,n) fa[i]=i; 
    res=0;
    fq(i,1,m) {
        int x1=find(a[i].x),=find(a[i].y);
        if(x1!=y1) {
            vis[i]=1,res++;
            fa[x1]=y1;
            sum+=a[i].z;
            P[a[i].x].push_back({a[i].y,a[i].z});
            P[a[i].y].push_back({a[i].x,a[i].z});
        } if(res==n-1) break;
    } res=0; dfs(1,0,0);
    int ans=inf;
    fq(i,1,m) {
        if(vis[i]) continue;
        int lca=LCA(a[i].x,a[i].y);
        int ans1=Q_max(a[i].x,lca,a[i].z);
        int ans2=Q_max(a[i].y,lca,a[i].z);
        ans=min(ans,sum-max(ans1,ans2)+a[i].z);
    } cout<<ans;
    return 0;
}

WA ON 4#

2024/9/10 21:53
加载中...