博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj - 1947 Rebuilding Roads
阅读量:7071 次
发布时间:2019-06-28

本文共 1157 字,大约阅读时间需要 3 分钟。

树形DP,一棵树有N个结点,给出一个P,要求切断最少的边使树的规模达到P。

这题我是参考的别人的代码,状态转移方程最初很难理解,后来明白了,它扫描时,默认父结点是光杆司令一个,随着扫描子树才把子树连到父结点上。

1 #include 
2 #define N 152 3 int fst[N],nxt[N],notrt[N]; 4 int dp[N][N],n,p; 5 void dfs(int u) 6 { 7 int i,j,v,t; 8 for(i = 0; i <= p; i++) dp[u][i]=N; 9 dp[u][1] = 0;10 for(v = fst[u]; v; v = nxt[v])11 {12 dfs(v);13 for(i = p; i >= 0; i--)14 {15 t = dp[u][i]+1;16 for(j = 0; j <= i; j++)17 if(dp[u][i-j] + dp[v][j] < t)18 t = dp[u][i-j] + dp[v][j];19 dp[u][i] = t;20 //printf("dp[%d][%d]:%d\n",u,i,t);21 }22 }23 }24 int main()25 {26 int i,a,b,ans;27 scanf("%d%d",&n,&p);28 for(i = 1; i < n; i++)29 {30 scanf("%d%d",&a,&b);31 nxt[b] = fst[a];32 fst[a] = b;33 notrt[b] = 1;34 }35 for(i = 1; notrt[i]; i++);36 dfs(i);37 ans = dp[i][p];38 for(i = 1; i <= n; i++)39 if(dp[i][p] < ans)40 ans = dp[i][p]+1;41 printf("%d\n",ans);42 return 0;43 }

转载于:https://www.cnblogs.com/lzxskjo/archive/2012/11/08/2761680.html

你可能感兴趣的文章
设置文本显示为2行,溢出隐藏后以省略号结尾
查看>>
Sequelize-nodejs-13-Working with legacy tables
查看>>
virtualbox+vagrant学习-2(command cli)-1-vagrant box命令
查看>>
数据库相关
查看>>
转:推荐一个包:Hashids,用来把整数生成唯一字符串(比如:通过加密解密id来隐藏真实id)...
查看>>
参考学习
查看>>
Cocos暂停和重新开始游戏
查看>>
知识发现过程
查看>>
mysql分组取每组大的记录
查看>>
Windows Server 2012 R2怎么配置域控制器?(转)
查看>>
matlab global
查看>>
php构造函数和析构函数
查看>>
javascript 坑
查看>>
Java并发常见问题
查看>>
LeetCode OJ - Valid Palindrome
查看>>
实现Windows程序的数据绑定
查看>>
离线数据存储
查看>>
bzoj 1030-1039
查看>>
[Unix学习笔记]terminal与shell之间的关系
查看>>
Dapper扩展SQL跟踪及全局缓存通知-日志入队列
查看>>