PAT 1090. Highest Price in Supply Chain (25) 从叶子节点出发去求树的高度

本文介绍了一个简单的算法,用于解决从树的非叶节点到根节点的最长路径查询问题,并统计相同长度路径的数量。通过递归地计算每个节点到根节点的距离,最终找到最长路径及其出现次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<string.h>
#include<cmath>
#include<string>
using namespace std;


//
/*************************
题意:
从底部向上查询到根部,求最长路径和该相同路径有多少个
*************************/

/************************
求解要点:
这个很简单,从非叶节点出发到根节点,同时修改过程中每个点的信息即可。
不要从根开始,因为一个点只有1个入度,但可能有2个出度,
************************/

/***********************
笔记:
*********************/

#define M 100005
#define INF 0xfffff

int father[M];
int noleaf[M];
int len[M];
int getlen(int node)
{
	if(node==-1)
		return -1;
	if(len[node]!=-1)
		return len[node];
	int p =father[node];
	len[node]=getlen(p)+1;
	return len[node];

}

int main()
{
	int n;
	double p,r;
	int f;
	int i;
	int root;
	scanf("%d%lf%lf",&n,&p,&r);
	memset(noleaf,0,sizeof(noleaf));
	for(i=0;i<n;i++)
	{
		len[i]=-1;
		scanf("%d",&f);
		father[i]=f;
		noleaf[f]=1;
	}

	int maxlen=-1,maxn=1;
	int len;
	for(i=0;i<n;i++)
		if(!noleaf[i])
		{
			len=getlen(i);
			if(len > maxlen)
			{
				maxlen=len;
				maxn=1;
			}
			else if(len==maxlen)
				maxn++;
		}

	while(maxlen--)
		p=p*(1+r/100);
	printf("%.2lf %d\n",p,maxn);
	return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值