您的位置:首页 > 其它

重建道路(树上背包)

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: