这个题目就很简单,硬说的话算树的遍历吗(其实完全不能算。。直接把结点过了一遍),给出每个结点的根结点,找出最长的,最后输出这样最长的总共有几个。找个数的话在更新max的时候把count清零,在找到等于max的另一条路径时count++就好。需要注意的是最长路径究竟是多长。最好找纸笔画一下图,就会发现按代码的思路去做的话求出来的是最长路径+1,所以最后要除掉
#include<stdio.h>
#include<stdlib.h>
#define number 17
int main() {
int n;
double p;
double r;//这个等会直接算出乘法系数来
int mt = 0;
scanf("%d%lf%lf", &n,&p,&r);
double max = p;
r /= 100;
r += 1;
int* a = (int*)malloc(sizeof(int)*n);
for (int i = 0;i < n;i++) {
scanf("%d", &a[i]);
}
int t;
double tp = p;
for (int i = 0;i < n;i++) {
t = i;
tp = p;
while (t != -1) {
t = a[t];
tp *= r;
}
if (tp > max) {
max = tp;
mt=0;
}
if (tp == max) {
mt++;
}
}
printf("%.2lf %d", max/r, mt);
return 0;
}