1 条题解
-
2
我的第二篇题解 本题目就是,在一个树中,删去一个点,把它分成几个独立的树,而后找到这几个树中结点最多的树,保证这个最多节点的树节点数最少。
板块: 1.用邻接表输入 2.互相添加,保证输入的树没问题 3.用深度优先搜索进行遍历
代码如下:
#include <bits/stdc++.h> using namespace std; const int N=100010,M=N*2; int n,ans=N; int h[N],e[M],ne[M],idx; bool st[N]; void add(int a,int b){ e[idx]=b; ne[idx]=h[a],h[a]=idx++; }//添加数组 int dfs(int u){ st[u]=true; int sum=1,res=0; for(int i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(!st[j]){//判断是否被加过 int s=dfs(j); sum+=s; res=max(res,s);//判断最大值最小 } } res=max(res,n-sum); ans=min(ans,res); return sum; }//深搜,搜索每个子块中的节点数量 int main() { cin>>n; memset(h,-1,sizeof h); for(int i=0;i<n-1;i++){ int a,b; cin>>a>>b; add(a,b),add(b,a); }//输入部分 dfs(1); cout<<ans<<endl; return 0; }
代码与苏老师同款的,不要抄,会讲的!
我感觉就是暴力
信息
- ID
- 372
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 9
- 标签
- 递交数
- 7
- 已通过
- 5
- 上传者