A1090 Highest Price in Supply Chain
计算一棵树最深的叶子结点的个数。
思路:
1、维持一个最大深度max_depth,初始化为一个很小的数字(正常情况不会达到),初始化最大深度叶子结点个数num=0。
2、递归边界:当前结点index没有孩子,说明已经到达叶子结点。
vector<int> Node[maxn];
int num = 0, max_depth = -1;
void DFS(int index, int depth)
{
if(Node[i].size() == 0) //如果是叶子节点
{
if(depth > max_depth) //深度比原来的最大深度大
{
max_depth = depth; //更新最大深度
num = 1; //num置为1
}
else if(depth == max_depth) //深度跟原来的最大深度一样大
{
num++; //num++
}
return;
}
for(int i = 0; i < Node[index].size(); i++) //递归访问index的子结点
DFS(Node[index][i], depth + 1);
}
A1079 Total Sales of Supply Chain
求最大价格,实际上还是求叶子结点所在的层数,不过增加了货物量(点权)的设定;
price = p * (1 + r)^depth(根结点为0,根结点深度为0)
struct node
{
vector<int> child; //子结点
double data; //货物量
}Node[maxn];
void DFS(int index, int depth)
{
int ans = 0;
if(Node[index].child.size() == 0) //叶子结点
{
ans += Node[index].data * pow(1 + r, depth);
return;
}
for(int i = 0; i < Node[index].child.size(); i++) //递归访问子结点
DFS(Node[index].child[i], depth + 1);
}
A1094 The Largest Generation
求树中结点个数最多的一层,根结点为1,层号为1。
思路:
定义一个hashtable数组,hashtable[i] = j 表示第 i 层有 j 个结点。进入函数时,hashtable[level] + 1,表示第 level 层的结点个数加1,之后遍历 index 的所有子结点。
最后遍历 hashtable 求最大值即可。
vector<int> Node[maxn];
int hashtable[maxn] = {0}; //每一层结点的个数
void DFS(int index, int level)
{
hashtable[level]++;
for(int i = 0; i < Node[index].size(); i++)
DFS(Node[index][i], level + 1);
}
A1106 Lowest Price in Supply Chain
求最低的价格(即最浅的叶子节点)
注意:根结点为0,根结点深度为0
const int maxn = 100010;
const int INF = 0x7fffff; //一个很大的数
vector<int> Node[maxn];
int num = 0; //最浅叶子结点的个数
minPrice = INF; //最小价格
void DFS(int index, int depth)
{
if(Node[i].size() == 0)
{
double price = p * pow(1 + r, depth));
if(price < minPrice)
{
minPrice = price;
num = 1;
}
else if(price == minPrice)
{
num++;
}
return;
}
for(int i = 0; i < Node[index].size(); i++)
DFS(Node[index][i], depth + 1);
}
A1004 Counting Leaves
求每一层有多少叶子结点
思路:开一个数组leaf表示每一层叶子结点的个数,max_h记录数的深度,方便后续输出,函数体中先要更新max_h,再判断当前结点是否为叶子结点。
const int maxn = 100010;
vector<int> Node[maxn];
int max_h = 1; //树的深度
int leaf[maxn] = {0}; //每一层叶子节点个数
void DFS(int index, int h)
{
max_h = max(max_h, h); //先更新深度
if(Node[index].size() == 0)
{
leaf[h]++;
return;
}
for(int i = 0; i < Node[index].size(); i++)
{
DFS(Node[index][i], h + 1);
}
}
//输出每一层叶子结点个数。
for(int i = 1; i <= max_h; i++)
printf("%d", leaf[i]);