题目描述
分析:树的遍历,找出最小的叶子结点
DFS
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=100005;
vector<int> G[maxn];
double s[maxn];
double minprice=0x3fffffff*1.0;
int minnum=0;
double R,P;
int N;
void DFS(int v){
if(G[v].empty()){
if(s[v]<minprice){
minprice=s[v];
minnum=1;
}
else if(s[v]==minprice){
minnum++;
}
}
for(int i:G[v]){
s[i]=s[v]*(1+R/100);
DFS(i);
}
}
int main(){
scanf("%d%lf%lf",&N,&P,&R);
for(int i=0;i<N;i++){
int m,x;
scanf("%d",&m);
while (m--)
{
scanf("%d",&x);
G[i].push_back(x);
}
}
s[0]=P;
DFS(0);
printf("%.4f %d",minprice,minnum);
}
BFS
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int maxn=100005;
vector<int> G[maxn];
double s[maxn];
double minprice=0x3fffffff*1.0;
int minnum=0;
double R,P;
int N;
void BFS(){
queue<int> q;
q.push(0);
while (!q.empty())
{
int v=q.front();
q.pop();
if(G[v].empty()){
if(s[v]<minprice){
minprice=s[v];
minnum=1;
}
else if(s[v]==minprice){
minnum++;
}
}
for(int i:G[v]){
s[i]=s[v]*(1+R/100);
q.push(i);
}
}
}
int main(){
scanf("%d%lf%lf",&N,&P,&R);
for(int i=0;i<N;i++){
int m,x;
scanf("%d",&m);
while (m--)
{
scanf("%d",&x);
G[i].push_back(x);
}
}
s[0]=P;
BFS();
printf("%.4f %d",minprice,minnum);
}