重建道路(树上背包)
2017-10-23 06:20
134 查看
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=160;
int n,a[maxn],fa[maxn],d[maxn]
,du[maxn],dp[maxn][maxn],m;
vector<int> g[maxn];
inline int read(){
int num=0; char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') num=num*10+ch-'0',ch=getchar();
return num;
}
void dfs(int x,int y){
fa[x]=y;
for(int i=0;i<g[x].size();i++){
if(g[x][i]==y) continue;
dfs(g[x][i],x);
}
}
void dp1(int x){
dp[x][1]=du[x];
for(int i=0;i<g[x].size();i++){
if(g[x][i]==fa[x]) continue;
dp1(g[x][i]);
for(int j=m;j>=2;j--){
for(int k=1;k<j;k++){
dp[x][j]=min(dp[x][j],dp[x][k]+dp[g[x][i]][j-k]-2);
}
}
}
}
int main(){
int u,vv,ww;
n=read(); m=read();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
dp[i][j]=1000;
}
for(int i=1;i<=n;i++) dp[i][0]=0;
for(int i=1;i<=n-1;i++){
u=read(); vv=read();
du[u]++; du[vv]++;
g[u].push_back(vv); g[vv].push_back(u);
fa[vv]=u;
}
//cout<<1<<endl;
//dfs(1,0);
//cout<<2<<endl;
dp1(1);
int ans=10000;
for(int i=1;i<=n;i++) ans=min(ans,dp[i][m]);
cout<<ans<<endl;
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=160;
int n,a[maxn],fa[maxn],d[maxn]
,du[maxn],dp[maxn][maxn],m;
vector<int> g[maxn];
inline int read(){
int num=0; char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') num=num*10+ch-'0',ch=getchar();
return num;
}
void dfs(int x,int y){
fa[x]=y;
for(int i=0;i<g[x].size();i++){
if(g[x][i]==y) continue;
dfs(g[x][i],x);
}
}
void dp1(int x){
dp[x][1]=du[x];
for(int i=0;i<g[x].size();i++){
if(g[x][i]==fa[x]) continue;
dp1(g[x][i]);
for(int j=m;j>=2;j--){
for(int k=1;k<j;k++){
dp[x][j]=min(dp[x][j],dp[x][k]+dp[g[x][i]][j-k]-2);
}
}
}
}
int main(){
int u,vv,ww;
n=read(); m=read();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
dp[i][j]=1000;
}
for(int i=1;i<=n;i++) dp[i][0]=0;
for(int i=1;i<=n-1;i++){
u=read(); vv=read();
du[u]++; du[vv]++;
g[u].push_back(vv); g[vv].push_back(u);
fa[vv]=u;
}
//cout<<1<<endl;
//dfs(1,0);
//cout<<2<<endl;
dp1(1);
int ans=10000;
for(int i=1;i<=n;i++) ans=min(ans,dp[i][m]);
cout<<ans<<endl;
return 0;
}
相关文章推荐
- 树上背包——洛谷P1272 重建道路
- 洛谷P1273 有线电视网 【树上分组背包】
- [2017纪中11-9]道路重建 点双连通分量+树的直径
- 2018山东冬令营 中石油 道路重建
- Codeforces Round #419 (Div. 1) C. Karen and Supermarket(树上背包)
- 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包
- HDU 4003 Find Metal Minaral 树上瞎搞分组背包
- luogu P1272 重建道路
- 【XJOI tree】树上背包+奇怪优化
- 1089: 最短路入门2(道路重建)
- 金明的预算方案加选课(树上的背包)
- [luogu1272]重建道路(树形dp)
- BZOJ5072[Lydsy十月月赛] 小A的树 解题报告【树上背包/树形DP】
- HDU-4003 Find Metal Mineral (树上背包)
- HDU 5148(Cities-树上背包)
- BZOJ1017 魔兽地图DotR (树上背包)
- hdu 4276 The Ghost Blows Light 区域网络赛 1010 树上背包+spfa
- HDU 4003 Find Metal Mineral 树上分组背包
- 一、树形dp(3)重建道路
- HDU4003 树上的分组背包