蓝桥杯 金属采集 树形动态规划

本文介绍了一种基于树形结构的动态规划算法实现方法,该算法用于解决特定类型的组合优化问题。通过定义状态转移方程,递归地计算从根节点到每个子节点的最佳路径成本,最终求得整个树形结构的最小总费用。
参考:http://www.myexception.cn/program/1598926.html
#include <iostream>
#include <vector>
using namespace std;

#define MAX_N 100005
#define NUM 11

int f[MAX_N][NUM];
bool vis[MAX_N];
int cost[MAX_N]; 
int n,s,k; 

struct Node{
	int v,val; 
};

vector<Node>node[MAX_N]; 

void dfs(int p){
	for (int i=0;i<=k;i++)
	{
		f[p][i]=0; 
	} 
	vis[p]=1; 

	for (int i=0;i<node[p].size();i++)
	{ 
		int son=node[p][i].v; 
		if (vis[son])continue; 
		cost[son]=node[p][i].val; 
		dfs(son); 

		for (int i=k;i>=0;i--)
		{
			f[p][i]+=(f[son][0]+2*cost[son]); 

			for (int j=1;j<=i;j++)
			{
				f[p][i]=min(f[p][i],f[son][j]+cost[son]*j+f[p][i-j]); 
			}
		}
	}
}
int main()
{
	int a,b,c; 
	Node son;  
	cin>>n>>s>>k; 
	for (int i=0;i<=n;i++)
	{
		node[i].clear(); 
		vis[i]=false; 
	}	
	for (int i=1;i<n;i++) 
	{
		cin>>a>>b>>c; 
		son.v=b; 
		son.val=c; 
		node[a].push_back(son); 
		son.v=a; 
		son.val=c; 
		node[b].push_back(son);  
	}
	dfs(s); 
	cout<<f[s][k]<<endl; 
	return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值