题目描述


分析:树的遍历,找出最小的叶子结点
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);
}
本文介绍了一种使用深度优先搜索(DFS)和广度优先搜索(BFS)算法来遍历树形结构,并找到最小叶子节点价格的方法。通过递归地访问每个节点并计算到达叶子节点的成本,最终确定最小成本及其出现次数。
778

被折叠的 条评论
为什么被折叠?



