题目大意:
给出树节点的数量,货物价格P,转手一次提高的比率r(就是从父节点到子节点,价格要在原来的基础上上涨r%),然后依次给出n的父节点编号,每个节点编号是第i个节点的父节点,如果是-1说明当前节点是树的总根节点。
解题思路:
很简单的DFS遍历树,递归计算当前节点价格就好,递归边界是当前节点是叶子节点,然后更新最大价格和供应链数量即可。
代码如下:
#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<list>
#include<queue>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
//vector ::iterator it;
//set<int>::iterator iter;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int n,sum=0;//节点数量,供应链数量
double p,r,ma=0;
struct node
{
double price;
vector<int> child;
}nod[110000];
void dfs(int root,double price)
{
if(nod[root].child.size()==0)//叶子节点
{
if(price>ma)
{
ma=price;
sum=1;
}
else if(price==ma)sum++;
return;
}
for(int i=0;i<nod[root].child.size();i++)//遍历当前节点的所有子节点
{
nod[nod[root].child[i]].price=price*r*0.01+price;//计算价格
dfs(nod[root].child[i], nod[nod[root].child[i]].price);
}
return;
}
int main()
{
// std::ios::sync_with_stdio(false);
// cin.tie(0);
// freopen("test.txt","r",stdin);
// freopen("output.txt","w",stdout);
scanf("%d %lf %lf",&n,&p,&r);
int root;
for(int i=0;i<n;i++)
{
int tmp;
scanf("%d",&tmp);
if(tmp==-1) root=i;//根节点
else nod[tmp].child.push_back(i);
}
nod[root].price=p;//初始化根节点价格
dfs(root,p);
printf("%0.2lf %d\n",ma,sum);
return 0;
}