本题未通过所有测试案例(18/25),希望有大佬能解答
本题链接:1021 Deepest Root - PAT (Advanced Level) Practice (pintia.cn)
题意:
给定一棵树,求哪个点作为根节点,使得树的高度最高
思路:
我的写法和算法笔记的思路不同,每个结点都dfs一下求出该点作为为根节点时,树的最大高度,然后用一个height数组存储这些值,最后sort一下输出结果,但是不知道为什么有几个测试点过不去
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n;
const int N = 10010;
int father[N];
vector< vector <int> > adj;
int height[N] = { 0 };//记录从该点遍历,树的高
void init(int n) {
for (int i = 0; i <= n; i++) {
father[i] = i;
}
for (int i = 0; i <= N; i++) {
vector<int> a;
adj.push_back(a);
}
}
int findFather(int x) {
int a = x;
while (x != father[x]) {
x = father[x];
}
//路径压缩
while (a != father[a]) {
int z = a;
a = father[a];
father[z] = x;
}
return x;
}
void Union(int a, int b) {
int fa = findFather(a);
int fb = findFather(b);
if (fa != fb) {
father[fa] = fb;
}
}
bool isRoot[N];
void initR() {
for (int i = 1; i < N; i++) {
isRoot[i] = false;
}
}
bool charge(int n) {
initR();
for (int i = 1; i <= n; i++) {
isRoot[findFather(i)] = true;
}
int num = 0;
for (int i = 0; i <= N; i++) {
if (isRoot[i]) {
num++;
}
}
if (num == 1) return true;
return false;
}
bool cmp(int a, int b) {
return a > b;
}
int nowMax = 0;
void dfs(int nowU, int heigh, int pre, int father) {
if (heigh > nowMax) {
nowMax = heigh;
height[father] = heigh;
}
for (int i = 0; i < adj[nowU].size(); i++) {
if (adj[nowU][i] == pre) continue;
dfs(adj[nowU][i], heigh + 1, nowU, father);
}
}
//首先需要判断图是否连通
//dfs每种情况,用一个hash表记录下当前结点做根的树高度
int main() {
cin >> n;
init(n);
for (int i = 0; i < n - 1; i++) {
int a, b;
cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
Union(a, b);
}
if (!charge(n)) {
cout << "Error: 2 components";
return 0;
}
for (int i = 1; i <= n; i++) {
nowMax = 0;
dfs(i, 0, i, i);
}
int res[N];
for (int i = 0; i < N; i++) {
res[i] = height[i];
}
sort(res, res + N, cmp);
for (int i = 0; i < N; i++) {
if (height[i] == res[0])
cout << i << endl;
}
return 0;
}