80分求助!
查看原帖
80分求助!
531900
__Devil__楼主2021/10/17 21:54

WA了两个点

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f 
#define M 2000010
#define N 1000010
#define ll long long
using namespace std;
inline void read(int &x){
	x=0;int f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		x=(x<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
	x*=f;
}
inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)
	write(x/10);
	putchar(x%10+'0');
}
struct edge{
    int x,y,z;
}E[M];
struct edgee{
    int to,next,val; 
}e[M];

int tot=0,m,n,minn=INF; 
ll ans=0;

int f[N][25],max1[N][25],max2[N][25],fa[N],head[N],dep[N],vis[N];

bool cmp(edge a,edge b){
    return a.z<b.z;
}
int find(int x){
    if(fa[x]==x) return x;
    return fa[x]=find(fa[x]);
}
void add(int u,int v,int w){
    e[++tot].to=v;
    e[tot].next=head[u];
    e[tot].val=w;
    head[u]=tot;
}
void kruscal(){
    int num=0;
    sort(E+1,E+m+1,cmp);
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++){
        int x=find(E[i].x);
        int y=find(E[i].y);
        if(x!=y){
            ans+=E[i].z;
			vis[i]=1;
            num++;
            fa[y]=x;
            add(E[i].x,E[i].y,E[i].z);
            add(E[i].y,E[i].x,E[i].z);
        } 
        if(num==n-1) break;
    }
}
void dfs(int x){
    for(int i=head[x];i;i=e[i].next){
        int v=e[i].to;                                                                                                      
        if(v==f[x][0]) continue;
        f[v][0]=x;
        max1[v][0]=e[i].val;
        dep[v]=dep[x]+1;
        for(int j=1;j<=20;j++){
            if(dep[v]<(1<<j)) break; 
            f[v][j]=f[f[v][j-1]][j-1];
            max1[v][j]=max(max1[v][j-1],max1[f[v][j-1]][j-1]);
            if(max1[v][j-1]==max1[f[v][j-1]][j-1])
              max2[v][j]=max(max2[v][j-1],max2[f[v][j-1]][j-1]);
            else{
                max2[v][j]=min(max1[v][j-1],max1[f[v][j-1]][j-1]);
                max2[v][j]=max(max2[v][j],max2[f[v][j-1]][j-1]);
                max2[v][j]=max(max2[v][j-1],max2[v][j]);
            }
        }
        dfs(v);
    }
}
int LCA(int a,int b)
{
    if(dep[a]>dep[b])swap(a,b);
    for(int i=20;i>=0;i--)if(dep[f[b][i]]>=dep[a])b=f[b][i];
    if(a==b) return a;
    for(int i=20;i>=0;i--)if(f[a][i]!=f[b][i])a=f[a][i],b=f[b][i];
    return f[a][0];
}
void change(int x,int lca,int val){
    int val1=0,val2=0;
    for(int i=0;i<=20;i++){
        if(dep[x]-dep[lca]<(1<<i)) break;
        if(dep[x]-dep[lca]&(1<<i)){
            if(max1[x][i]>val1){
                val2=max(val1,max2[x][i]);
                val1=max1[x][i];
            }
            x=f[x][i];
        }
    }
    if(val!=val1) minn=min(minn,val-val1);
    else minn=min(minn,val-val2);
}
int main(){
    read(n);read(m);
    for(int i=1;i<=m;i++){
        read(E[i].x);read(E[i].y);read(E[i].z);
    }
    kruscal();
    dfs(1);
	for(int i=1;i<=m;i++){
        if(!vis[i]){
            int x=E[i].x,y=E[i].y;
            int lca=LCA(x,y);
            change(x,lca,E[i].z);change(y,lca,E[i].z);
        }
    }
    write(ans+minn);putchar('\n');
} 
2021/10/17 21:54
加载中...