P4149 75pts,3RE,2WA,求调
  • 板块灌水区
  • 楼主porse114514
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/22 15:45
  • 上次更新2024/7/22 16:36:48
查看原帖
P4149 75pts,3RE,2WA,求调
528926
porse114514楼主2024/7/22 15:45
#include<bits/stdc++.h>
using namespace std;
#define man max
#define men min
const int maxn = 2000010,INF = 40000001;
struct edge{
	int to,v;
};
int n,k,a,b,c,rt,cnt;
int maxp[maxn],sz[maxn],vis[maxn],sp[maxn],spp[maxn],p[maxn],dis[maxn],diss[maxn],t[INF + 10],minn = INF;
vector<edge> G[maxn];
void getrt(int u,int sum,int fa)
{
	sz[u] = 1;
	maxp[u] = 0;
	for(int i = 0;i < G[u].size();i++)
	{
		int now = G[u][i].to;
		if(now == fa || vis[now]) continue;
		getrt(now,sum,u);
		sz[u] += sz[now];
		maxp[u] = man(maxp[u],sz[now]); 
	}
	maxp[u] = man(maxp[u],sum - sz[u]);
	if(maxp[u] < maxp[rt]) rt = u;
	return ;
}
void getdis(int u,int fa)
{
	sp[++sp[0]] = dis[u];
	spp[++spp[0]] = diss[u];
	for(int i = 0;i < G[u].size();i++)
	{
		int now = G[u][i].to,vv = G[u][i].v;
		if(now == fa || vis[now]) continue;
		dis[now] = dis[u] + vv;
		diss[now] = diss[u] + 1;
		getdis(now,u);
	}
	return ;
}
void calc(int u)
{
	cnt = 0;
	for(int i = 0;i < G[u].size();i++)
	{
		int now = G[u][i].to,vv = G[u][i].v;
		if(vis[now]) continue;
		sp[0] = 0;
		spp[0] = 0;
		dis[now] = vv;
		diss[now] = 1;
		getdis(now,u);
		for(int j = 1;j <= sp[0];j++)
		{
			if(t[k - sp[j]])
			{
				if(k - sp[j] == 0) minn = min(minn,spp[j]);
				else minn = min(minn,spp[j] + t[k - sp[j]]);
			}
		}
		for(int j = 1;j <= sp[0];j++)
		{
			p[++cnt] = sp[j];
			t[sp[j]] = men(t[sp[j]],spp[j]);
		}
	}
	for(int i = 1;i <= cnt;i++)
	{
		t[p[i]] = INF;
	}
	return ;
}
void solve(int u)
{
	vis[u] = t[0] = 1;
	calc(u);
	for(int i = 0;i < G[u].size();i++)
	{
		int now = G[u][i].to;
		if(vis[now]) continue;
		rt = 0;
		maxp[rt] = INF;
		getrt(now,sz[now],u);
		solve(rt);
	}
	return ;
}
signed main()
{
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	cin >> n >> k;
	for(int i = 1;i < n;i++)
	{
		cin >> a >> b >> c;
		G[a + 1].push_back({b + 1,c});
		G[b + 1].push_back({a + 1,c});
	}
	for(int i = 0;i <= INF;i++)
	{
		t[i] = INF;
	}
	rt = 0;
	maxp[rt] = INF;
	getrt(1,n,0);
	solve(rt);
	if(minn < INF) cout << minn;
	return 0;
}
2024/7/22 15:45
加载中...