1090 Highest Price in Supply Chain (25 分)
题意
给出一系列节点,这些节点可构成一棵树,求树的深度以及最深结点的个数。
第一行给出三个数,节点个数n(节点编号从0 - n-1) 初始价格p,每层增加百分比r(每层增加%r)。
第二行给出n个数a[i],表示编号为 i 的父节点为a[i]。注意并不一定是二叉树。
思路
由于不用考虑节点的点权以及子节点数量不确定可以用vector数组存树。
下标代表节点编号,向量中存储子节点编号。
找树的深度:可以通过bfs遍历树(层序遍历),开一个深度数组,在遍历过程中记录结点的深度,找到最深的节点和个数。
代码
#include<stdio.h>
#include<queue>
#include<vector>
#include<string.h>
#include<math.h>
using namespace std;
//typedef struct node{
// vector<int>next;
// int order=0;
//}node;
vector<int>btree[100007];
int order[100007];
int main()
{
int n,m,root,xmax=0,sum=0;
double r,p;
memset(order,0,sizeof(order));
scanf("%d%lf%lf",&n,&p,&r);
for(int i=0;i<n;i++){
scanf("%d",&m);
// printf("$$$$$$\n");
if(m==-1){ //注意判别-1,否则数组越界
root=i;
}else{
btree[m].push_back(i);
}
}
// for(int i=0;i<n;i++){
// printf("%d ->",i);
// for(int j=0;j<btree[i].size();j++){
// printf(" %d ",btree[i][j]);
// }
// printf("\n");
// }
// printf("@@\n");
queue<int>q;
q.push(root);
while(!q.empty()){
// printf("####\n");
m=q.front();
q.pop();
for(int i=0;i<btree[m].size();i++){
order[btree[m][i]]=order[m]+1;
if(order[m]+1>xmax){
xmax=order[m]+1;
}
q.push(btree[m][i]);
}
}
for(int i=0;i<n;i++){
if(xmax==order[i]){
sum++;
}
}
double ans=p*pow(1+r*0.01,xmax);
printf("%.2lf %d\n",ans,sum);
return 0;
}