题目
大体思路
用邻接表来存树,用dfs进行遍历.
具体实现
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N = 100005 ,M = 2 * N;
int ans = N,idx,n;
int h[N],e[M],ne[M]; //用邻接表存储树
bool st[N];
void add(int a,int b){ // a -> c
//idx 永远指向一个空的位置
//所以可以拿过来直接用
e[idx] = b; // a-> b -> c
ne[idx] = h[a];
h[a] = idx++;
}
int dfs(int u){
int son_max = 0,sum = 0;
for(int i=h[u];i!=-1;i=ne[i]){ //这里面除了有它的子节点之外,其实还有其父节点,因为是无向图.
//而其父节点和子节点的区别就是,父节点被访问过了,因为只能通过父节点
//找到子节点,而子节点还未被访问过.
int j = e[i],t; // i 第几个插入的点
// j 才是树节点的编号
if(!st[j]){
st[j] = 1;
t = dfs(j);
}
else{ //else这一句是啥意思???
continue;
}
son_max = max(t,son_max);
sum += t;
}
son_max = max(son_max,n - sum - 1); //求出连通块中的最大值
ans = min(ans,son_max); //找最大值中的最小值
// 别忘了给ans一开始赋一个最大值
return sum + 1; //这里很重要
}
int main(){
scanf("%d",&n);
int a,b;
memset(h,-1,sizeof h); //在string.h中
for(int i=0;i<n -1;i++){
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs(1);
printf("%d\n",ans);
return 0;
}