求助,WA75
查看原帖
求助,WA75
52244
Gliese楼主2020/9/26 20:26
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
//save node
int head[100010];
struct node{
	int nxt,v,w;
	inline void addedge(int u,int v,int w)
	{
		this->v=v;
		this->w=w;
		this->nxt=head[u];
		head[u]=cnt;
	}
}pnt[100010];

//bianary
int l,r,mid;
int f[100010];
void dfs(int u,int root)
{
	multiset<int>s;
	for(int i=head[u]; i; i=pnt[i].nxt)
	{
		int v=pnt[i].v,w=pnt[i].w;
		if(v==root)
			continue;
		dfs(v,u);
		if(f[v]+w>=mid)
			cnt++;
		else s.insert(f[v]+w);
	}
	while(!s.empty())
	{
		multiset<int>::iterator it=s.begin();
		s.erase(it);
		multiset<int>::iterator it1=s.lower_bound(mid-*it);
		if(it1==s.end())
			f[u]=max(f[u],*it);
		else s.erase(*it1),cnt++;
	}
}
inline bool check()
{
	memset(f,0,sizeof(f));
	cnt=0;
	dfs(1,0);
	if(cnt<m)
		return 0;
	return 1;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1; i<n; ++i)
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		pnt[++cnt].addedge(a,b,c);
		pnt[++cnt].addedge(b,a,c);
		r+=c;
		l=min(l,c);
	}
	r/=m;
	int ans=0;
	while(l<=r)
	{
		mid=(l+r)>>1;
		if(check())
			ans=mid,l=mid+1;
		else r=mid-1;
	}
	cout<<ans;
	return 0;
}
2020/9/26 20:26
加载中...