https://www.patest.cn/contests/pat-a-practise/1106
找最近的叶节点, bfs。
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
typedef struct node {
int k;
vector<int> edges;
}Node;
int n;
double r, price;
vector< Node > G;
int main() {
int k,a;
scanf("%d %lf %lf",&n,&price,&r);
int count = 0,minRetDeep = n + 1;
G.resize(n+1);
queue<pair<int, int>> q;
for (size_t i = 0; i < n; i++)
{
scanf("%d", &k);
G[i].k = k;
for (size_t j = 0; j < k; j++)
{
scanf("%d", &a);
G[i].edges.push_back(a);
}
}
q.push(pair<int, int>(0, 0));
while (!q.empty()) {
int node = q.front().first;
int deep = q.front().second;
q.pop();
if (minRetDeep < deep) break;
if (G[node].k == 0) {
// printf("%d %d\n", node, deep);
if (minRetDeep > deep) {
minRetDeep = deep;
count = 1;
}
else if (minRetDeep == deep) {
count++;
}
}
for (size_t i = 0; i < G[node].k; i++)
{
q.push(pair<int, int>(G[node].edges[i], deep + 1));
}
}
double res = price;
for (size_t i = 0; i < minRetDeep; i++)
{
res *= (1+r/100.0);
}
printf("%.4lf %d\n", res, count);
}