RE求调
  • 板块题目总版
  • 楼主mgcjade
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/31 14:01
  • 上次更新2023/11/3 00:12:39
查看原帖
RE求调
733626
mgcjade楼主2023/8/31 14:01

P2015 二叉苹果树

我在本地跑没有问题,交到 洛谷洛谷 上就 RERE 了
#include <bits/stdc++.h>
using namespace std;

int hd[105], nxt[205], v[205], to[205], tot;
void add(int x, int y, int z)
{
	tot++;
	to[tot] = y;
	v[tot] = z;
	nxt[tot] = hd[x];
	hd[x] = tot;
}

int n, m;
int f[105][105];
bool vis[105];

int dp(int k)
{
	int sm = 0, sonl, sonr, underl = 0, underr = 0;
	vis[k] = 1;
	for(int i = hd[k]; i; i = nxt[i])
	{
		if(!vis[to[i]])
		{
			if(!sm)
			{
				sonl = i;
				underl = min(m - 1, dp(to[i]));
			}
			
			else
			{
				sonr = i;
				underr = min(m - 1, dp(to[i]));
			}
			
		
			sm++;
		}
	}
	
	for(int j = 0; j <= underl; j++)
		f[k][j + 1] = max(f[k][j + 1], f[to[sonl]][j] + v[sonl]);
	for(int j = 0; j <= underr; j++)
		f[k][j + 1] = max(f[k][j + 1], f[to[sonr]][j] + v[sonr]);
		
	
	for(int i = 0; i <= underl; i++)
		for(int j = 0; j <= underr && i + j <= m - 2; j++)
			f[k][i + j + 2] = max(f[k][i + j + 2], f[to[sonl]][i] + f[to[sonr]][j] + v[sonl] + v[sonr]);
	
	return underl + underr + sm;
}

int main()
{
	scanf("%d%d", &n, &m);
	int a, b, c;
	for(int i = 1; i < n; i++)
	{
		scanf("%d%d%d", &a, &b, &c);
		add(a, b, c);
		add(b, a, c);
	}
	
	dp(1);
	
	printf("%d\n", f[1][m]);
	
	return 0;
}
2023/8/31 14:01
加载中...