WA80求助,悬赏3r
查看原帖
WA80求助,悬赏3r
261981
Jiyuu_no_Tsubasanirvana楼主2022/8/6 22:05
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+10;
int n,m;
vector<pair<int,int> > g[N];
int f[N];
bool cmp(int x,int y){
	return x>y;
}
int sum;
void dfs(int x,int fa,int v){
	vector<int> e,b;
	for(int i=0;i<g[x].size();i++){
		int y=g[x][i].first;
		int z=g[x][i].second;
		if(y==fa) continue;
		dfs(y,x,v);
		if(z+f[y]>=v) sum++;
		else{
			e.push_back(z+f[y]);
			b.push_back(0);
		}
	}
	sort(e.begin(),e.end(),cmp);
	int l=0,r=e.size()-1;
	while(l<=r){
		while(l<r&&e[l]+e[r]<v) r--;
		if(l==r) break;
		sum++;
		b[l++]=b[r--]=1;
	}
	for(int i=0;i<e.size();i++)
		if(!b[i]){
			f[x]=e[i];
			return;
		}
}
bool check(int x){
	memset(f,0,sizeof(f));
	sum=0;
	dfs(1,0,x);
	return sum>=m;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<n;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		g[x].push_back(make_pair(y,z));
		g[y].push_back(make_pair(x,z));
	}
	int l=0,r=5e8,mid;
	while(l<r-1){
		mid=l+r>>1;
		if(check(mid)) l=mid;
		else r=mid;
	}
	printf("%d",check(r)?r:l);
	return 0;
}

2022/8/6 22:05
加载中...