DFS走一遍,找出最大深度,如果最大深度的叶结点不止一个,则统计数量。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
vector<vector<int>> chains;
int maxLevel = 0;
int maxNum = 0;
void dfs(int src, int level){
if(chains[src].empty()){
if(maxLevel < level){
maxLevel = level;
maxNum = 1;
}else if(maxLevel == level){
maxNum++;
}
return;
}
for(auto& next : chains[src]){
dfs(next, level + 1);
}
}
int main(){
int n;
double p,r;
cin >> n >> p >> r;
chains.resize(n, vector<int>());
int root = -1;
for(int i = 0; i < n; ++i){
int s;
scanf("%d", &s);
if(s == -1) root = i;
else chains[s].push_back(i);
}
dfs(root, 0);
printf("%.2f %d", p * pow(1+r/100, maxLevel), maxNum);
return 0;
}