PAT目录
供应链最低价格,即求树的最短距离,采用记忆搜索、dfs深度优先的方法。
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int N=1e5+10;
int n;
double p,r;
int f[N],d[N];
bool is_leaf[N];
int dfs(int u){
if(d[u]!=-1) return d[u];
if(f[u]==-1) return d[u]=0;
return d[u]=dfs(f[u])+1;
}
int main(){
cin>>n>>p>>r;
memset(f,-1,sizeof f);
for(int i=0;i<n;i++){
int k;cin>>k;
for(int j=0;j<k;j++){
int son;cin>>son;
f[son]=i;
}
if(k==0) is_leaf[i]=true;
}
memset(d,-1,sizeof d);
int res=N,cnt=0;
for(int i=0;i<n;i++){
if(is_leaf[i]){
if(dfs(i)<res) res=dfs(i),cnt=1;
else if(dfs(i)==res) cnt++;
}
}
printf("%.4lf %d",p*pow(1+r/100.0,res),cnt);
return 0;
}