80分蒟蒻求助
查看原帖
80分蒟蒻求助
126415
nodeee楼主2020/5/31 21:08

#4,#10 WA

#include<bits/stdc++.h>
using namespace std;
int n,m;
int head[100005];
struct e{
    int nxt,to;
    long long sum;
}edge[600005];
int cnte;
int used[300005];
int tot;
int logg;
void add_edge(int u,int v,long long w){
    tot++;
    edge[tot].nxt=head[u];
    edge[tot].to=v;
    edge[tot].sum=w;
    head[u]=tot;
}
struct ee{
    int from,to;
    long long sum;
}ed[300005];
int cmp(ee a,ee b){
    return a.sum<b.sum;
}
int fa[100005];
int find(int x){
    if(x==fa[x])return x;
    return fa[x]=find(fa[x]);
}
void unite(int x,int y){
    int fx=find(x),fy=find(y);
    fa[fx]=fy;
}
long long ans;
void kruskal(){
    for(int i=1;i<=cnte;i++){
        if(find(ed[i].from)!=find(ed[i].to))unite(ed[i].from,ed[i].to),ans+=ed[i].sum,used[i]=1;
    }
}
int f[100005][30],d[100005];
long long maxn[100005][30][2];
void init(int now,int father,int depth){
    d[now]=depth;
    int nxt;
    for(int i=head[now];i;i=edge[i].nxt){
        nxt=edge[i].to;
        if(nxt==father)continue;
        f[nxt][0]=now;
        maxn[nxt][0][0]=edge[i].sum;
        for(int j=1;j<=logg;j++){
            f[nxt][j]=f[f[nxt][j-1]][j-1];
            maxn[nxt][j][0]=max(maxn[nxt][j-1][0],maxn[f[nxt][j-1]][j-1][0]);
            if(maxn[nxt][j-1][0]==maxn[f[nxt][j-1]][j-1][0])maxn[nxt][j][1]=max(maxn[nxt][j-1][1],maxn[f[nxt][j-1]][j-1][1]);
            if(maxn[nxt][j-1][0]>maxn[f[nxt][j-1]][j-1][0])maxn[nxt][j][1]=max(maxn[nxt][j-1][1],maxn[f[nxt][j-1]][j-1][0]);
            if(maxn[nxt][j-1][0]<maxn[f[nxt][j-1]][j-1][0])maxn[nxt][j][1]=max(maxn[nxt][j-1][0],maxn[f[nxt][j-1]][j-1][1]);
        }
        init(nxt,now,depth+1);
    }
}
long long LCA(int x,int y,long long sum){
    long long re=0;
    if(maxn[x][logg][0]<sum)re=maxn[x][logg][0];
    else re=maxn[x][logg][1];
    if(maxn[y][logg][0]<sum)re=max(re,maxn[y][logg][0]);
    else re=max(re,maxn[y][logg][1]);
    return re;
}
int main(){
    scanf("%d%d",&n,&m);
    int u,v,w;
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&u,&v,&w);
        if(u==v)continue;
        cnte++;
        ed[cnte].from=u,ed[cnte].to=v,ed[cnte].sum=w;
    }
    for(int i=1;i<100005;i++){
        fa[i]=i;
    }
    logg=log2(n)+1;
    sort(ed+1,ed+1+cnte,cmp);
    kruskal();
    for(int i=1;i<=cnte;i++){
        if(used[i])add_edge(ed[i].from,ed[i].to,ed[i].sum),add_edge(ed[i].to,ed[i].from,ed[i].sum);
    }
    init(1,0,1);
    long long minn=LLONG_MAX;
    for(int i=1;i<=cnte;i++){
        if(used[i])continue;
        long long lca=ed[i].sum-LCA(ed[i].from,ed[i].to,ed[i].sum);
        minn=min(minn,lca);
    }
    ans+=minn;
    printf("%lld\n",ans);
    return 0;
}

2020/5/31 21:08
加载中...