【树形DP】 POJ 1947 Rebuilding Roads
2015-05-17 10:27
399 查看
点击打开链接
最少剪去多少条边使得存在一个节点数为P的树
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#include<queue>
#include <string>
#include <sstream>
#include <map>
#include <vector>
#define LL long long
#define N 1000100
const int INF= 1e8;
vector<int>g[191];
int dp[189][192];//1 节点 ,2 算上该节点有多少点
int n,p,x,y,num[200];
int dfs(int u,int pre)
{
num[u]=1;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(v==pre) continue;
num[u]+=dfs(v,u);
for(int j=num[u];j>1;j--)
{
for(int k=1;k<j;k++)
{
dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[v][k]-1);//表示 不剪这条边 先前已经剪过所以需要-1
}
}
}
return num[u];
}
int main()
{
while(scanf("%d%d",&n,&p)!=EOF)
{
for(int i=0;i<=n;i++) g[i].clear();
for(int i=0;i<n-1;i++)
{
cin>>x>>y;
g[x].push_back(y);
}
// memset(dp,-1,sizeof(dp));
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++) dp[i][j] = INF;
for(int i=0;i<=n;i++) dp[i][1]=g[i].size();//初始化
dfs(1,1);
int ans=dp[1][p];
for(int i=2;i<=n;i++) ans=min(ans,dp[i][p]+1);
cout<<ans<<endl;
}
return 0;
}
最少剪去多少条边使得存在一个节点数为P的树
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#include<queue>
#include <string>
#include <sstream>
#include <map>
#include <vector>
#define LL long long
#define N 1000100
const int INF= 1e8;
vector<int>g[191];
int dp[189][192];//1 节点 ,2 算上该节点有多少点
int n,p,x,y,num[200];
int dfs(int u,int pre)
{
num[u]=1;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(v==pre) continue;
num[u]+=dfs(v,u);
for(int j=num[u];j>1;j--)
{
for(int k=1;k<j;k++)
{
dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[v][k]-1);//表示 不剪这条边 先前已经剪过所以需要-1
}
}
}
return num[u];
}
int main()
{
while(scanf("%d%d",&n,&p)!=EOF)
{
for(int i=0;i<=n;i++) g[i].clear();
for(int i=0;i<n-1;i++)
{
cin>>x>>y;
g[x].push_back(y);
}
// memset(dp,-1,sizeof(dp));
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++) dp[i][j] = INF;
for(int i=0;i<=n;i++) dp[i][1]=g[i].size();//初始化
dfs(1,1);
int ans=dp[1][p];
for(int i=2;i<=n;i++) ans=min(ans,dp[i][p]+1);
cout<<ans<<endl;
}
return 0;
}
相关文章推荐
- POJ 1947 Rebuilding Roads (树形dp)
- POJ 1947 Rebuilding Roads 树形DP
- POJ 1947 Rebuilding Roads 题解【树形DP】
- POJ 1947 Rebuilding Roads(树形DP)
- POJ 1947 Rebuilding Roads(树形DP + 01背包)
- POJ 1947 Rebuilding Roads(树形DP)
- POJ_1947 Rebuilding Roads --树形DP
- POJ 1947 Rebuilding Roads(树形DP)
- POJ 1947 Rebuilding Roads(基础的树形dp)
- POJ 1947树形DP
- POJ-1947 Rebuilding Roads 树形DP
- POJ 1947 树形DP
- poj 1947 Rebuilding Roads 树形dp
- poj 1947 树形dp
- 【树形DP】 POJ 1155 / 1947 树形背包
- POJ 1947 Rebuilding Road(树形DP)
- 长吐一口气~树形DP汇总(POJ 2486 3659 2342 1947 1463 hdu 2412 )
- poj 1947 Rebuilding Roads (树形dp)
- POJ 1947 树形DP入门题
- poj 1947 简单树形dp building roads