原题
题目大意及思路
题目中给了零售商、经销商和供应商之间的信息,需要我们找出能够达到的最便宜的物价以及能买到这个价的零售商的个数。
虽然题中说的是供应商、经销商、零售商,其实对应树中的根节点、中间节点和叶子节点,要找到最低价格其实就是找到最小深度的叶子结点。
找最低价格的过程就是DFS遍历整棵树的过程,并且供应商的个数在叶子结点的时候进行更新。
代码
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int maxn,number=0;
const int maxnumber=100010;
vector<int> Adj[maxnumber];
void DFS(int index,int d){
if(Adj[index].size()==0){
if(d<maxn){
maxn=d;
number=1;
}
else if(d==maxn) number++;
return;
}
for(int i=0;i<Adj[index].size();i++) DFS(Adj[index][i],d+1);
}
int main(){
int n;
double p,r;
cin>>n>>p>>r;
maxn=n;
for(int i=0;i<n;i++){
int k;
cin>>k;
for(int j=0;j<k;j++){
int conj;
cin>>conj;
Adj[i].push_back(conj);
}
}
DFS(0,0);
double ans=p*pow(1+0.01*r,maxn);
printf("%.4lf %d",ans,number);
return 0;
}
运行截图
收获
一定要看清楚题目要求!