51nod 1378 夹克老爷的愤怒(树型dp+贪心)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1378
题意:
思路:
要想放得少,尽量放在叶子节点处,叶子节点处点比较多。
从叶子节点开始往上回溯,到第k个点时就放置一名家丁,用dp[x]来记录状态,若为负,则表示该节点及其子树所需要家丁的最远距离,若为正,则表示该节点及其子树中家丁还能镇压的最大距离。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn = 100000+5; 6 const int inf = 0x3f3f3f3f; 7 8 int n,k,tot,ans; 9 int head[maxn],dp[maxn]; 10 11 struct node 12 { 13 int v,next; 14 }e[2*maxn]; 15 16 void addEdge(int u, int v) 17 { 18 e[tot].v = v; 19 e[tot].next = head[u]; 20 head[u] = tot++; 21 } 22 23 void dfs(int u, int fa) 24 { 25 int mi = inf; 26 int mx = -inf; 27 for(int i=head[u];i!=-1;i=e[i].next) 28 { 29 int v = e[i].v; 30 if(v == fa) continue; 31 dfs(v,u); 32 mx = max(mx,dp[v]); 33 mi = min(mi,dp[v]); 34 } 35 if(mi == inf) //叶子节点的情况 36 { 37 dp[u] = -1; 38 } 39 else if(mi <= -k) //有节点超过k距离了,此时u必须要放置家丁 40 { 41 ans++; 42 dp[u] = k; 43 } 44 else if(mx+mi > 0) //有节点能镇压住家丁 45 { 46 dp[u] = mx - 1; 47 } 48 else //向上请求家丁 49 dp[u] = mi - 1; 50 } 51 52 int main() 53 { 54 //freopen("in.txt","r",stdin); 55 scanf("%d%d",&n,&k); 56 tot = ans = 0; 57 memset(head,-1,sizeof(head)); 58 for(int i=1;i<n;i++) 59 { 60 int u,v; 61 scanf("%d%d",&u,&v); 62 addEdge(u,v); 63 addEdge(v,u); 64 } 65 if(k==0) {printf("%d\n",n);return 0;} 66 dfs(0,-1); 67 if(dp[0]<0) ans++; 68 printf("%d\n",ans); 69 return 0; 70 }
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
分类:
动态规划—树形DP
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)