这道题发的第四个帖子,Krushal+LCA WA 了。
查看原帖
这道题发的第四个帖子,Krushal+LCA WA 了。
658786
STUDENT00楼主2022/11/7 20:57
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,anss,ans=1e18;
struct node{
    int x,y,z;
} a[300010];
bool cmp(node a,node b){
    return a.z<b.z;
}
vector<pair<int,int> > v[100010];
bool vis[300010],vv[300010];
int fat[100010],fa[100010][20],maxs[100010][20],h[100010];
int find(int x){
    if(fat[x]==x) return x;
    return fat[x]=find(fat[x]);
}
void Krus(){
    int s=0;
    for(int i=1;i<=n;i++) fat[i]=i;
    for(int i=1;i<=m;i++){
        int x=find(a[i].x),y=find(a[i].y);
        if(x!=y){
            vis[i]=1;
            fat[x]=y;
            s++;
            anss+=a[i].z;
            v[a[i].x].push_back(make_pair(a[i].y,a[i].z));
            v[a[i].y].push_back(make_pair(a[i].x,a[i].z));
        }
        if(s==n-1) break;
    }
}
void dfs(int now,int s){
    h[now]=s;
    for(int i=0;i<v[now].size();i++){
        int t=v[now][i].first;
        if(!vv[t]){
            fa[t][0]=now;
            maxs[t][0]=v[now][i].second;
            vv[t]=1;
            dfs(t,s+1);
        }
    }
}
void init(){
    for(int i=1;i<20;i++){
        for(int j=1;j<=n;j++) fa[j][i]=fa[fa[j][i-1]][i-1];
    }
    for(int i=1;i<20;i++){
        for(int j=1;j<=n;j++) maxs[j][i]=max(maxs[j][i-1],maxs[fa[j][i-1]][i-1]);
    }
}
int f(int a,int b){
    if(h[a]<h[b]) swap(a,b);
    int s=0;
    while(h[a]>h[b]){
        int l=log2(h[a]-h[b]);
        s=max(s,maxs[a][l]);
        a=fa[a][l];
    }
    for(int i=log2(h[a]);i>=0;i--){
        if(fa[a][i]!=fa[b][i]){
           s=max(s,max(maxs[a][i],maxs[b][i]));
            a=fa[a][i];
            b=fa[b][i];
        }
    }
    return max(s,max(maxs[a][0],maxs[b][0]));
}
signed main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].z);
    sort(a+1,a+m+1,cmp);
    Krus();
    vv[1]=1;
    dfs(1,0);
    init();
    for(int i=1;i<=m;i++){
        if(!vis[i]) ans=min(ans,anss-f(a[i].x,a[i].y)+a[i].z);
    }
    printf("%lld",ans);
    return 0;
}

我今天一定要通过这题,不然我就要呜呜呜呜了。。。

2022/11/7 20:57
加载中...