hdu5148 树形dp,分组背包
2015-05-18 17:45
274 查看
dp[i][j]表示以i为根节点的子树中选j个城市贡献边长的最小值,怎样由子树向上递推呢,子树是一个天然的组,dp[u][j]可以这样理解,u子树容量为j是由上一层dp[u][j-f]推出的,应用了滚动数组。
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<cmath> #include<iomanip> #include<map> #include<algorithm> #include<queue> #include<set> #define inf 10000000000000 #define pi acos(-1.0) #define eps 1e-8 #define seed 131 using namespace std; typedef pair<int,int> pii; typedef unsigned long long ull; typedef long long ll; const int maxn=100005; ll dp[2005][55]; vector<pii>g[2005]; int n,k; void dfs(int u,int fa) { for(int i=0;i<g[u].size();i++) { if(g[u][i].first==fa) continue; dfs(g[u][i].first,u); int v=g[u][i].first; for(int j=k;j>=0;j--) { for(int f=0;f<=j;f++) { dp[u][j]=min(dp[u][j],dp[u][j-f]+dp[v][f]+f*(k-f)*2*g[u][i].second); } } } } int main() { int t; int a,b,c; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) g[i].clear(); for(int i=0;i<n-1;i++) { scanf("%d%d%d",&a,&b,&c); g[a].push_back(pii(b,c)); g[b].push_back(pii(a,c)); } memset(dp,-1,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=0;j<=k;j++) { if(j<=1) dp[i][j]=0; else dp[i][j]=inf; } } dfs(1,-1); cout<<dp[1][k]<<endl; } return 0; }
相关文章推荐
- POJ 1947 树形DP(分组背包)
- hdu 4003 Find Metal Mineral 【树形dp,分组背包】
- HDU4003Find Metal Mineral[树形DP 分组背包]
- 【树形DP】【分组背包】【HDU1561】
- hdu1561 The more, The Better(常见分组背包+树形dp)
- hdu 5148 树形dp,分组背包
- hdu 4276 树形DP + 分组背包
- Hihocoder 1055 树形DP(分组背包)
- [HDU] 1561 The more, The Better 树形DP加01分组背包
- 树形DP+(分组背包||二叉树,一般树,森林之间的转换)codevs 1378 选课
- HDU 4003 Find Metal Mineral(分组背包+树形DP)
- HDU 4003 (树形DP + 分组背包)
- ZOJ 3201 Tree of Tree(树形dp + 分组背包)
- poj1947 ----- 树形DP - 分组背包做法
- 分组背包+树形DP(BY LPX)
- HDU 4276 树形dp+spfa+分组背包
- 树形DP+背包(poj1155泛化分组背包)
- (中等) 树形dp(分组背包) POJ 3345 Bribing FIPA
- 树形DP+背包(poj1155泛化分组背包)
- 【POJ1947】Rebuilding Roads,树形DP(本文分组背包做法)