1106 供应链最低价格
供应链是由零售商,经销商和供应商构成的销售网络,每个人都参与将产品从供应商转移到客户的过程。
整个销售网络可以看作一个树形结构,从根部的供应商往下,每个人从上一级供应商中买入商品后,假定买入价格为 P,则会以高出买入价 r% 的价格向下出售。
只有零售商(即叶节点)可以直接将产品销售给顾客。
现在,给定整个销售网络,请你计算零售商能达到的最低销售价格。
输入格式
第一行包含三个数,N 表示供应链总成员数(所有成员编号从 0 到 N−1,根部供应商编号为 0),P 表示根部供应商的产品售卖价格,r,溢价百分比。
接下来 N 行,每行包含一个成员的信息,格式如下:
Ki ID[1] ID[2]… ID[Ki]
其中第 i 行,Ki 表示从供应商 i 直接进货的成员数,接下来 Ki 个整数是每个进货成员的编号。
如果 Kj 为 0 则表示第 j 名成员是零售商。
输出格式
输出零售商可达到的最低销售价格,保留四位小数,以及可达到最低销售价格的零售商的数量。
数据范围
1≤N≤10^5,
0<P≤1000,
0<r≤50,
最终答案保证不超过 10^10
输入样例:
10 1.80 1.00
3 2 3 5
1 9
1 4
1 7
0
2 6 1
1 8
0
0
0
输出样例:
1.8362 2
实现代码:
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int N=1e5+5;
vector<int>v[N];
int level[N],vis[N];
int n,res=0x3f3f3f3f;
double p,r;
void bfs(int x){
queue<pair<int,int> >q;
q.push({x,0});
while(q.size()){
int dis=q.front().second;
int s=q.front().first;
q.pop();
if(vis[s])continue;
vis[s]=1;
if(v[s].size()==0){
res=min(res,dis),level[s]=dis;
}
for(int i=0;i<v[s].size();i++){
q.push({v[s][i],dis+1});
}
}
}
int main(){
cin>>n>>p>>r;
for(int i=0;i<n;i++){
int k;
cin>>k;
while(k--){
int x;
cin>>x;
v[i].push_back(x);
}
}
bfs(0);
int cnt=0;
for(int i=0;i<res;i++)p*=(1+r/100);
for(int i=0;i<n;i++)if(level[i]==res)cnt++;
printf("%.4lf %d",p,cnt);
return 0;
}