学校校园网站,软文写作经验,注册200万公司需要多少费用,天津手机网站开发给定一颗树#xff0c;树中包含 n 个结点#xff08;编号 1∼n#xff09;和 n−1 条无向边。
请你找到树的重心#xff0c;并输出将重心删除后#xff0c;剩余各个连通块中点数的最大值。
重心定义#xff1a;重心是指树中的一个结点#xff0c;如果将这个点删除后树中包含 n 个结点编号 1∼n和 n−1 条无向边。
请你找到树的重心并输出将重心删除后剩余各个连通块中点数的最大值。
重心定义重心是指树中的一个结点如果将这个点删除后剩余各个连通块中点数的最大值最小那么这个节点被称为树的重心。
输入格式
第一行包含整数 n表示树的结点数。
接下来 n−1 行每行包含两个整数 a 和 b表示点 a 和点 b 之间存在一条边。
输出格式
输出一个整数 m表示将重心删除后剩余各个连通块中点数的最大值。
数据范围
1≤n≤
输入样例
9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6输出样例
4
代码
#includeiostream
#includevector
#includealgorithm
#includecstring
using namespace std;const int N 100010;
int StartNode[N],edgeTo[N*2],NextThisNode[N*2];
int idx,n,ans;
int att[N*2];void add(int a,int b){edgeTo[idx] b;NextThisNode[idx] StartNode[a];StartNode[a] idx;idx ;
}int dfs(int x){att[x] 1;int sum 1;int res 0;for(int i StartNode[x];i ! -1;i NextThisNode[i]){int j edgeTo[i];if(att[j] 0){int temp dfs(j);res max(res,temp);sum temp;}}res max(n - sum,res);ans min(res,ans);return sum;
}int main(){int a,b;cinn;ans n;memset(StartNode,-1,sizeof StartNode);for(int i 0;i n;i){cinab;add(a,b);add(b,a);}dfs(1);coutansendl;return 0;
}