题目描述

分析:树的遍历,找出价值最大的结点。
DFS
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=100005;
vector<int> G[maxn];
double s[maxn],maxprice=0;
double R,P;
int maxnum=0;
void DFS(int v){
if(s[v]>maxprice){
maxprice=s[v];
maxnum=1;
}
else if(s[v]==maxprice){
maxnum++;
}
for(int i:G[v]){
s[i]=s[v]*(1+R/100);
DFS(i);
}
}
int main(){
int N,root;
scanf("%d%lf%lf",&N,&P,&R);
for(int i=0;i<N;i++){
int x;
scanf("%d",&x);
if(x==-1){
root=i;
}
else{
G[x].push_back(i);
}
}
s[root]=P;
DFS(root);
printf("%.2f %d",maxprice,maxnum);
return 0;
}
BFS
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int maxn=100005;
vector<int> G[maxn];
double s[maxn],maxprice=0;
double R,P;
int maxnum=0;
void BFS(int root){
queue<int> q;
q.push(root);
while(!q.empty()){
int v=q.front();
q.pop();
if(s[v]>maxprice){
maxprice=s[v];
maxnum=1;
}
else if(s[v]==maxprice){
maxnum++;
}
for(int i:G[v]){
q.push(i);
s[i]=s[v]*(1+R/100);
}
}
}
int main(){
int N,root;
scanf("%d%lf%lf",&N,&P,&R);
for(int i=0;i<N;i++){
int x;
scanf("%d",&x);
if(x==-1){
root=i;
}
else{
G[x].push_back(i);
}
}
s[root]=P;
BFS(root);
printf("%.2f %d",maxprice,maxnum);
return 0;
}