90ptsWAon #3.
查看原帖
90ptsWAon #3.
455490
Sharpsmile楼主2021/11/28 21:21

讨论区也没有找到和我错误点一样的于是来求救了。。。。。。。。

额。。。

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#define int long long
#define inlind inline void
#define inlinl inline bool
#define inlint inline int
#define inlinc inline char
#define inlins inline string
#define mem0(a) memset(a,0,sizeof(a))
#define memf(a) memset(a,0x3f,sizeof(a))
#define mem_f(a) memset(a,0x80,sizeof(a))
#define mem_1(a) memset(a,-1,sizeof(a))
#define pb(a,b) a.push_back(b)
#define mp(a,b) make_pair(a,b)
#define p1(x) x.first
#define p2(x) x.second
using namespace std;
const int INF=0x7fffffffffffff;
vector<pair<int,int > >g[100030];
int fa[100030],f[100030][32][2],fw[100030][32];//fa并查集,f是倍增最大值,fw是倍增祖先
int dep[100030];
struct edge{int u,v,w;
    bool ch;
    inlind in(){
        scanf("%lld%lld%lld",&u,&v,&w);
    }
}e[610000];
inlinl cmp(edge x,edge y){
    return x.w<y.w;
}
int n,m;
inlint ff(int x){
    if(fa[x]==x) return x;
    return fa[x]=ff(fa[x]);
}
inlind merge(int x,int y){
    int mx=ff(x),my=ff(y);
    if(mx!=my) fa[mx]=my;
}
inlinl check(int x ,int y){
    int mx=ff(x),my=ff(y);
    return mx==my;
}
inlind dfs(int id,int ffa,int d){
    dep[id]=d;
    for(int i=1;(1<<i)<=dep[id];i++){
        fw[id][i]=fw[fw[id][i-1]][i-1];
        f[id][i][1]=max(f[ fw[id][i-1] ][i-1][1],f[id][i-1][1]);
        if(f[fw[id][i-1]][i-1][1]!=f[id][i-1][1])
            f[id][i][0]=min(f[ fw[id][i-1] ][i-1][1],f[id][i-1][1]);
        else
            f[id][i][0]=max(f[ fw[id][i-1] ][i-1][0],f[id][i-1][0]);
    }
    int k=g[id].size();
    for(int i=0;i<k;i++){
        int v=p1(g[id][i]),w=p2(g[id][i]);
        if(v==ffa)continue;
        f[v][0][1]=w;
        f[v][0][0]=-INF;
        fw[v][0]=id;
        dfs(v,id,d+1);
    }
}
inline pair<int,int> lca(int x,int y){
    if(dep[x]<dep[y]) swap(x,y);
    int maxa1=-INF,maxa2=-INF;
    for(int i=30;i>=0;i--){
        if((1<<i)<=dep[x]&&dep[fw[x][i]]>=dep[y]) {
            if(f[x][i][1]>maxa1){
                maxa2=maxa1;
                maxa1=f[x][i][1];
            }
            else if(f[x][i][1]>maxa2&&f[x][i][1]!=maxa1)maxa2=f[x][i][1];
            else maxa2=max(maxa2,f[x][i][0]);
            x=fw[x][i];
        }
    }
    if(x==y) return mp(maxa1,maxa2);
    for(int i=30;i>=0;i--){
        if(dep[x]>=(1<<i)&&(fw[x][i]!=fw[y][i]||i==0)){
            if(f[y][i][1]>maxa1){
                maxa2=maxa1;
                maxa1=f[y][i][1];
            }
            else if(f[y][i][1]>maxa2&&f[y][i][1]!=maxa1)maxa2=f[y][i][1];
            else maxa2=max(maxa2,f[y][i][0]);
            y=fw[y][i];
            
            
            if(f[x][i][1]>maxa1){
                maxa2=maxa1;
                maxa1=f[x][i][1];
            }
            else if(f[x][i][1]>maxa2&&f[x][i][1]!=maxa1)maxa2=f[x][i][1];
            else maxa2=max(maxa2,f[x][i][0]);
            x=fw[x][i];
        }
    }
    return mp(maxa1,maxa2);
 }
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        fa[i]=i;
    }
    int ans1=0,ans2=INF;
    for(int i=1;i<=m;i++)e[i].in();
    sort(e+1,e+m+1,cmp);
    for(int i=1;i<=m;i++){
        int u=e[i].u,v=e[i].v,w=e[i].w;
        if(!check(u,v)&&u!=v){
            e[i].ch=1;
            merge(u,v);
            ans1+=w;
            pb(g[u],mp(v,w));
            pb(g[v],mp(u,w));
        }
    }
    dfs(1,-1,1);
    for(int i=1;i<=m;i++){
        if(e[i].ch||e[i].u==e[i].v) continue;
        pair<int,int> ko=lca(e[i].u,e[i].v);
        if(p1(ko)==e[i].w){
            if(p2(ko)!=e[i].w)
            ans2=min(ans2,ans1+e[i].w-p2(ko));
        }
        else ans2=min(ans2,ans1+e[i].w-p1(ko));
      //  cout<<p1(ko)<< " "<<p2(ko)<<endl;
    }
    cout<<ans2;
    return 0;
    
}

2021/11/28 21:21
加载中...