PTA-L2-026 小字辈 (25分)

PTA-L2-026 小字辈 (25分)

传送门

这道题就是dfs.
就是问树的高度
我们把祖先给标记出来。
然后从祖先开始dfs.
同时在dfs中更新数的高度。
同时记录当前操作的最底结点。
一旦发现有更深的,我们需要清空。在进行存储。
用set来存储。可以查重,因为我们可能dfs到同一个结点上面去。
最后输出即可。
(因为我们输入的时候就是按照递增顺序来的,所以不需要sort了)

代码部分:

#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
using namespace std;
const int N = 1e5 + 10;
const int M = 55;
const int INF = 1e6 + 10;
const double eps = 0.05;
typedef long long ll;

int n;
vector<int> v[N];
set<int> s;
int sum;

void dfs(int x, int cnt)
{
    
    
	if (cnt > sum)
	{
    
    
		sum = cnt;
		s.clear();
		s.insert(x);
	}
	else if (cnt == sum)
	{
    
    
		s.insert(x);
	}
	int siz = v[x].size();
	for (int i = 0; i < siz; i++)
	{
    
    
		dfs(v[x][i], cnt + 1);
	}
}

int main()
{
    
    
	int root;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
    
    
		int x;
		scanf ("%d", &x);
		if (x == -1)
		{
    
    
			root = i;
			continue;
		}
		v[x].push_back(i);
	}
	dfs(root, 1);
	cout << sum << endl;
	set<int>::iterator it;
	for (it = s.begin(); it != s.end(); it++)
	{
    
    
		if (it != s.begin())
		{
    
    
			cout << " ";
		}
		cout << *it;
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_44624316/article/details/110247679