寒假Day54:poj2378-Tree Cutting-没用树形dp写的树的题-dfs
题意:
给出一个n,代表一棵树有n个结点,接下去给出 n - 1 行,代表两个相连的结点
从小到大输出结点,结点满足的条件:当删去这个结点和与它相邻的边后,剩下的每一部分的节点都 ≤ n/2
思路:
用vector存邻边
从小到大输出结点 --->book标记最后再for循环遍历一遍即可
node数组存储的是该结点下所有的结点总和
看代码比较好理解
dfs部分代码:
int dfs(int x) { bool flag=0; node[x]=1; for(int i=0; i<v[x].size(); i++) { int p=v[x][i]; if(book1[p]==0) { book1[x]=1;//注意这边标记谁 int w=dfs(p);//用一个变量代替,不要去调用两次dfs,因为状态有所改变 if(w>n/2) flag=1; node[x]+=w; } } if(flag==0&&n-node[x]<=n/2) book2[x]=1; return node[x]; }
AC代码:
#include<stdio.h> #include<iostream> #include<string.h> #include<vector> using namespace std; const int N=10020; int n,node[N]; bool book1[N],book2[N]; vector<int>v[N]; int dfs(int x) { bool flag=0; node[x]=1; for(int i=0; i<v[x].size(); i++) { int p=v[x][i]; if(book1[p]==0) { book1[x]=1;//注意这边标记谁 int w=dfs(p);//用一个变量代替,不要去调用两次dfs,因为状态有所改变 if(w>n/2) flag=1; node[x]+=w; } } if(flag==0&&n-node[x]<=n/2) book2[x]=1; return node[x]; } int main() { while(cin>>n) { memset(book1,0,sizeof(book1)); memset(book2,0,sizeof(book2)); for(int i=1; i<n; i++) { int x,y; cin>>x>>y; v[x].push_back(y); v[y].push_back(x); } book1[1]=1; dfs(1); for(int i=1; i<=n; i++) { if(book2[i]) cout<<i<<endl; } } return 0; }
在网上看到这一片是用树形dp写的,下次学习,今天学不动了:
分类:
搜索
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」