做了24分钟,满分
// 1106 Lowest Price in Supply Chain (25 分).cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <bits/stdc++.h>
using namespace std;
#define max 10000000000
vector<vector<int>> supply_chain;
unordered_map<int, bool> have_parent;
unordered_map<int, bool> visited;
vector<double> final_price;
int n;
double p, r;
double lowest_price = max;
void dfs(int root, double price, double rate) {
if (supply_chain[root].size() == 0) {
if (price < lowest_price) {
lowest_price = price;
}
final_price.push_back(price);
return;
}
for (int i = 0; i < supply_chain[root].size(); i++) {
if (visited[supply_chain[root][i]] != true) {
//没有访问过,对应的下标里面
visited[supply_chain[root][i]] = true;
//需不需要生成相关的路径,似乎是不需要的,因为递归自身会进行维护
dfs(supply_chain[root][i], price * (1 + rate), rate);
visited[supply_chain[root][i]] = false;
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
FILE* s;
freopen_s(&s, "in.txt", "r", stdin);
#endif // !ONLINE_JUDGE
cin >> n >> p >> r;
int k,t;
supply_chain.resize(n);
for (int i = 0; i <= n-1; i++) {
cin >> k;
for (int j = 0; j < k; j++) {
cin >> t;
//供应链里面对应的下标然后去录入相关的信息;
//寻找根供应商,其实这个是一棵树的概念,那些没有被标记的位置
supply_chain[i].push_back(t);
have_parent[t] = true;
}
}
//通过遍历供应商的id的方式来寻找根
int root = -1;
for (int i = 0; i <= n - 1; i++) {
if (have_parent[i] != true) {
root = i;
}
}
//深度优先遍历,寻找最低的价格,但是要把最低的价格都加进去
dfs(root, p, r/100.0);
int count = 0;
for (int i = 0; i < final_price.size(); i++) {
if (final_price[i] == lowest_price) {
count++;
}
}
printf("%.4lf %d\n", lowest_price, count);
return 0;
}