史山求调
查看原帖
史山求调
1471248
lifeam楼主2025/1/20 10:48
#include<bits/stdc++.h>
using namespace std;
int n,s,u,v,ans;
int b[302][302],tp[302],lll;
bool use[302],f;
map <int,int> m;
int t[302],sum,jk,maa=0;
void dfs(int p,int l){
	if (l>=maa){
		jk=p;
		maa=l;
	}
	for (int i=1;i<=n;i++){
		if ((!use[i])&&b[p][i]){
			use[i]=1;
//			cout<<i<<c<<endl;
			dfs(i,l+b[p][i]);
			use[i]=0;
		}
	}
	return;
}
void find(int p,int c){
	if (p==v){
		f=1;
		t[c]=v;
		sum=c;
		return;
	}
	for (int i=1;i<=n;i++){
		if ((!use[i])&&b[p][i]){
			use[i]=1;
//			cout<<i<<c<<endl;
			find(i,c+1);
			if (f){
				t[c]=p;
				return;
			}
		}
	}
	return;
}
int dfs1(int q){
	if (m[q]==1){
		return 1;
	}
	for (int i=1;i<=n;i++){
		if ((!use[i])&&b[q][i]){
			use[i]=1;
			lll+=b[q][i];
			if (dfs1(i)==0){
				lll-=b[q][i];
			}
			else{
				return 1;
			}
		}
	}
	return 0;
}
signed main(){
	scanf("%d%d",&n,&s);
	for (int i=1;i<n;i++){
		int x,y,l;
		scanf("%d%d%d",&x,&y,&l);
		b[x][y]=b[y][x]=l;
		tp[x]++;
		tp[y]++;
	}
	for (int i=1;i<=n;i++) b[i][i]=0;
	use[1]=1;
	dfs(1,0);
	memset(use,0,sizeof(use));
	u=jk;
	use[u]=1;
	dfs(u,0);
	memset(use,0,sizeof(use));
	v=jk;
	use[u]=1;
	find(u,1);
	int o=1,s1,s2;
	int mid=maa/2,cd=0;
	while (cd<mid) cd+=b[t[o]][t[++o]];
	s1=cd,s2=maa-cd;
	int r=o;
	m[o]=1;
	while (s>0&&r>1&&o<n){
		if (s<b[t[r]][t[r-1]]&&s<b[t[o]][t[o+1]]){
			break;
		}
		else{
			if (s1>s2&&s>=b[t[r]][t[r-1]]){
				s-=b[t[r]][t[r-1]];
				s1-=b[t[r]][t[r-1]];
				r--;
				m[r]=1;
			}
			else{
				if (s1>s2){
					s-=b[t[o]][t[o+1]];
					s2-=b[t[o]][t[o+1]];
					o++;
					m[o]=1;
				}
				else{
					if (s>=b[t[r]][t[r-1]]){
						s-=b[t[r]][t[r-1]];
						s1-=b[t[r]][t[r-1]];
						r--;
						m[r]=1;
					}
					else{
						s2-=b[t[o]][t[o+1]];
						s-=b[t[o]][t[o+1]];
						o++;
						m[o]=1;
					}
				}
			}
		}
	} 
	for (int i=1;i<=n;i++){
		if (tp[i]==1){
			memset(use,0,sizeof(use));
			lll=0;
			use[i]=1;
			if (dfs1(i)){
				ans=max(ans,lll);
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
2025/1/20 10:48
加载中...