PTA-L2-026 ジュニア(25点)

PTA-L2-026 ジュニア(25点)

ポータル

この質問は dfs です.
木の高さについてであり
、祖先をマークします.
次に、祖先から DFS を開始し、
同時に DFS の数値の高さを更新します。
同時に、現在の操作の最下位ノードを記録します。
より深いものを見つけたら、それを空にする必要があります。保管中。
セットを使って収納。同じノードに dfs する可能性があるため、重複を確認できます。
最後に出力します。
(入力すると昇順になるので、ソートする必要はありません)

コード部分:

#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