80pts求助!
查看原帖
80pts求助!
678191
Eric_jx楼主2023/6/26 18:18
#include<bits/stdc++.h>
using namespace std;
long long h[100005];
long long e[100005];
long long ne[100005];
long long depth[100005];
long long f[100005][35];
long long w[10005];
long long logg[100005];
long long bin[1005];
long long s[100005];
long long cnt=0;
void add(long long x,long long y,long long z){
	e[++cnt]=y;
	w[cnt]=z;
	ne[cnt]=h[x];
	h[x]=cnt;
}
void jx(long long a,long long fa){
	f[a][0]=fa;
	depth[a]=depth[fa]+1;
	for(long long i=1;i<=logg[depth[a]];i++){
		f[a][i]=f[f[a][i-1]][i-1];
	}
	for(long long i=h[a];i!=0;i=ne[i]){
		long long vv=e[i];
		if(vv!=fa){
			jx(vv,a);
		}
	}
}
long long lca(long long x,long long y){
	if(depth[x]<depth[y]){
		swap(x,y);
	}
	while(depth[x]>depth[y]){
		x=f[x][logg[depth[x]-depth[y]]];
	}
	if(x==y){
		return x;
	}
	for(long long i=logg[depth[x]];i>=0;i--){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}	
	return f[x][0];
}
void dfss(long long u,long long fa,long long sum){
	s[u]=sum;
	for(long long i=h[u];i!=0;i=ne[i]){
		long long y=e[i];
		if(y!=fa){
			dfss(y,u,sum+w[i]); 
		}
	}
}
long long maxdis,zj1,zj2;
void dfs1(long long u,long long fa,long long sum){
	if(sum>maxdis){
		maxdis=sum;
		zj1=u;
	}
	for(long long i=h[u];i!=0;i=ne[i]){
		long long y=e[i];
		if(y!=fa){
			dfs1(y,u,sum+w[i]);
		}
	}
}
void dfs2(long long u,long long fa,long long sum){
	if(sum>maxdis){
		maxdis=sum;
		zj2=u;
	}
	for(long long i=h[u];i!=0;i=ne[i]){
		long long y=e[i];
		if(y!=fa){
			dfs2(y,u,sum+w[i]);
		}
	}
}
int main(){
	bin[0]=1;
	for(long long i=1;i<=30;i++){
		bin[i]=bin[i-1]*2;
	}
	long long n,mi;
	cin>>n>>mi;
	logg[1]=0;
	for(long long i=2;i<=n;i++){
		logg[i]=logg[i>>1]+1;
	}
	for(long long i=1;i<=n-1;i++){
		long long a,b,c;
		scanf("%lld%lld%lld",&a,&b,&c);
		add(a,b,c);
		add(b,a,c);
	}
	jx(1,0);
	dfss(1,0,0);
	dfs1(1,0,0);
	maxdis=0;
	dfs2(zj1,0,0);
	long long ans=0;
	for(long long i=1;i<=n;i++){
		long long k1=s[i]+s[zj1]-2*s[lca(i,zj1)];
		long long k2=s[i]+s[zj2]-2*s[lca(i,zj2)];
		ans=max(ans,min(k1,k2)+maxdis);
	}
	cout<<ans;
	return 0;
}
2023/6/26 18:18
加载中...