解题过程的小记录,如有错误欢迎指出。
难度:三星(在做完1012后弄懂排序规则后此题并不难)
题目分析
销售链问题,用DFS解的话这题就是求最小深度,以及该深度上的叶子个数
注意点
- 根在哪里需要自己找
- 用DFS时,root为第0层,因为第0层是供应商,是原价
我的解题过程
思路
- 构建树,因为本题不需要用到结点的数据域,所以直接开一个vector数组用于存储每个结点的孩子即可
- 写DFS函数,找出深度最浅的叶子结点和其个数(深度最浅的叶子也就是经过供应商层数最少的零售商,价格是最低的),当DFS到深度>已经记录的最浅深度,可以进行剪枝
bug
- 构建树的时候输入数据出了问题,没有搞清每个时刻输入数据的含义(都写了这么多次了还搞不清,我真菜)
- 又漏看了题设已经给出的root默认下标为0(我真菜again)
代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
using namespace std;
int n, mindepth = 100010, cnt = 1;
double p, r;
vector<int> child[100005];
void DFS(int index, int depth) {
if (depth > mindepth) return;
if (child[index].size() == 0) {
if (depth < mindepth) {
mindepth = depth;
cnt = 1;
}
else cnt++;
return;
}
for (int i = 0; i < child[index].size(); i++) {
DFS(child[index][i], depth + 1);
}
}
int main()
{
scanf("%d %lf %lf", &n, &p, &r);
r /= 100;
int ishead[100005] = {0}, head;
for (int i = 0; i < n; i++) {
int childnum;
scanf("%d", &childnum);
if (childnum != 0) {
for (int j = 0; j < childnum; j++) {
int childindex;
scanf("%d", &childindex);
ishead[childindex] = 1;
child[i].push_back(childindex);
}
}
}
/*
for (int i = 0; i < n; i++) {//题目已经给定了root是0下标,这一块没必要
if (ishead[i] == 0) {
head = i;
break;
}
}
*/
DFS(0, 0);
printf("%.4f %d", p*pow(1 + r, mindepth), cnt);
return 0;
}
dalao的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
销售链问题做过很多次了,此处不再赘述