PAT A1079 Total Sales of Supply Chain--树---dfs遍历

总结:

1.在第一次写这道题的时候,我觉着这道题思路挺明确的,不好解决的是题目里说节点数不超过10的10次方有点大了,不好开数组,而且我对于每一道关于树的题我都避免用结构体创建树,怕问题变得麻烦,要么就是通过一个一维数组创建树,或者取巧不创建。

2.在这道题中我的思路是每一个节点i都是一个vector[i],vector的大小就是其孩子的个数,在读入数据时候我们要确认根节点以及叶子节点的amount,用一个数组就ok,然后从根节点开始,如果遇到叶节点就把给叶结点的sale加上sum,如果不是叶节点就高度加1,遍历其孩子节点。在这道题中我遇到的问题是超时问题—数组开多大的问题,以及1测试点答案错误无从解决

3.在看完参考代码后(from  https://www.liuchuo.net/archives/2212),发现我的思路是完全没毛病的,但是显然使用vector,用在输入节点个数后,resize()vector的大小—方便得多,而且最后我才明白了我的代码未通过的测试点就是根节点找错—–特么题目明明说了根节点就是0—————————-不过下道题万一不说我就赚 了哈哈哈哈哈哈哈!!!!!!!!—求你别粗心了

 

《PAT A1079 Total Sales of Supply Chain--树---dfs遍历》

代码1:

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int leave[300000];
int total[300000];
int gen[300000];
int g = 0;
int number; double price, tt;
double psp;
vector<int> pp[300000];
int root = -1;
double sum = 0.0;
void level(int yy,int high)
{
    if (pp[yy].size() != 0)
    {
        for (int i = 0; i < pp[yy].size(); i++)
            level(pp[yy][i],high+1);
    }
    else {
        sum += total[yy] * price*(pow(psp,high));
    }
}
int main()
{
    cin >> number >> price >> tt;
    for (int i = 0; i < number; i++)
    {
        int p;
        cin >> p;
        if (p == 0){ int spp; cin >> spp; gen[i] = -1; leave[g++] = i; total[leave[g – 1]] = spp; }
        else{
            for (int j = 0; j < p; j++)
            {
                int sp;
                cin >> sp;
                gen[sp] = -1;
                pp[i].push_back(sp);
            }
        }
    }
    for (int i = 0; i < number; i++)
    {
        if (gen[i] != -1)root = i;
    }
    //cout <<“根为:”<< root;//
    //cout << endl;                 //
      psp = (100+tt)/100;
    level(root,0);
    printf(“%.1f”,sum);
    return 0;
}

《PAT A1079 Total Sales of Supply Chain--树---dfs遍历》

 

    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/luoshiyong123/article/details/81985389
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞