树、图 | DFS & BFS

下面两题用DFS或BFS都可以比较顺的AC。关键是得到各个结点的深度。

1079 Total Sales of Supply Chain (25 分)

我的做法是先BFS得到各结点level,然后计算prices单价倍率数组,最后输出时再乘原始价格,尽量少些乘法次数= =。
⚠️16分和25分之间,之差float -> double,尽量用double啊

#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>

#define MAXN 100010
using namespace std;
int nn;
struct Node {
    int level;
    double amt = 0.0;
    vector<int> children;
} tree[MAXN];

int BFS(int root) {
    queue<int> mq;
    tree[root].level = 0;
    mq.push(root);
    int curr, lvl = 0;
    while (!mq.empty()) {
        curr = mq.front();
        mq.pop();
        lvl = tree[curr].level + 1;
        for (int i = 0; i < tree[curr].children.size(); ++i) {
            int child = tree[curr].children[i];
            tree[child].level = lvl;
            mq.push(child);
        }
    }
    return lvl;
}

int main() {
    double ori, rate;
    scanf("%d%lf%lf", &nn, &ori, &rate);
    vector<int> retailer;
    for (int i = 0; i < nn; ++i) {
        int nch;
        scanf("%d", &nch);
        if (nch) {
            int ch;
            while (nch--) {
                scanf("%d", &ch);
                tree[i].children.emplace_back(ch);
            }
        } else {
            scanf("%lf", &tree[i].amt);
            retailer.emplace_back(i);
        }
    }
    int mlvl = BFS(0);
    vector<double> prices;
    double rrr = 1.0, rr = 1.0 + rate / 100.0, total = 0.0;
    for (int k = 0; k <= mlvl; ++k) {
        prices.emplace_back(rrr);
        rrr *= rr;
    }
    for (int j = 0; j < retailer.size(); ++j) {
        total += tree[retailer[j]].amt * prices[tree[retailer[j]].level];
    }
    printf("%.1lf\n", total * ori);
    return 0;
}
1090 Highest Price in Supply Chain (25 分)

⚠️DFS求结点深度时,要将depth作为参数一层一层传进去,而不能仅仅把depth作为全局变量。max_depth和零售商数量可用全局变量。
⚠️最高价零售商数量:计数最大深度结点即可。

#include <cstdio>
#include <cmath>
#include <vector>

#define MAXN 100010

using namespace std;
int nn, max_depth = -1, retailer_cnt = 0;
vector<int> nodes[MAXN];

void dfs(int root, int depth) {
    int size = nodes[root].size();
    if (size == 0) {
        if (depth > max_depth) {
            max_depth = depth;
            retailer_cnt = 1;
        } else if (depth == max_depth)
            retailer_cnt++;
    }
    for (int i = 0; i < size; ++i) {
        dfs(nodes[root][i], depth + 1);
    }
}

int main() {
    double ori_price, rate;
    scanf("%d%lf%lf", &nn, &ori_price, &rate);
    int root, father;
    for (int i = 0; i < nn; ++i) {
        scanf("%d", &father);
        if (father == -1) root = i;
        else nodes[father].emplace_back(i);
    }
    dfs(root, 0);
    printf("%.2lf %d\n", ori_price * pow(1.0 + rate / 100.0, max_depth), retailer_cnt);
    return 0;
}
1094 The Largest Generation (25 分)
#include <cstdio>
#include <vector>
#include <queue>

#define MAXN 101
using namespace std;
vector<int> tree[MAXN];
vector<int> cnts;
int nn, mm, level[MAXN];

void BFS(int root) {
    queue<int> mq;
    mq.push(root);
    level[root] = 1;
    cnts.emplace_back(1);
    while (!mq.empty()) {
        int curr = mq.front();
        mq.pop();
        for (int i = 0; i < tree[curr].size(); ++i) {
            if (cnts.size() > level[curr])
                cnts.emplace_back(0);
            mq.push(tree[curr][i]);
            level[tree[curr][i]] = level[curr] + 1;
            cnts[level[curr] + 1]++;
        }
    }
}

int main() {
    scanf("%d%d", &nn, &mm);
    cnts.emplace_back(0);
    int member, nch, child;
    for (int i = 0; i < mm; ++i) {
        scanf("%d%d", &member, &nch);
        for (int j = 0; j < nch; ++j) {
            scanf("%d", &child);
            tree[member].emplace_back(child);
        }
    }
    BFS(1);
    int Mcnt = 0, gen = -1;
    for (int i = 0; i < cnts.size(); ++i) {
        if (cnts[i] > Mcnt) {
            Mcnt = cnts[i];
            gen = i;
        }
    }
    printf("%d %d\n", Mcnt, gen);
    return 0;
}

📅1205 离考研还有15天 我好刚啊
DFS版 更简单嗷

#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;
int nn, cnts[100] = {0}, M = 0;
vector<int> gra[100];

void DFS(int root, int level) {
    cnts[level]++;
    M = max(level, M);
    for (auto item: gra[root]) {
        DFS(item, level + 1);
    }
}

int main() {
    int mm, anc = 1;
    scanf("%d%d", &nn, &mm);
    for (int i = 0; i < mm; i++) {
        int par, temp, kid;
        scanf("%d%d", &par, &temp);
        for (int j = 0; j < temp; j++) {
            scanf("%d", &kid);
            gra[par].push_back(kid);
        }
    }
    DFS(anc, 1);
    int midx = 0;
    for (int i = 1; i <= M; i++) {
        if (cnts[i] > cnts[midx])
            midx = i;
    }
    printf("%d %d\n", cnts[midx], midx);
    return 0;
}
1004 Counting Leaves (30 分)
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;
int nn, n_hasleaf;
vector<int> nodes[101];
int level_leaf_cnt[101], Mlevel = -1;

void DFS(int root, int level) {
    Mlevel = max(Mlevel, level);
    int size = nodes[root].size();
    if (size == 0) level_leaf_cnt[level]++;
    else
        for (int i = 0; i < size; ++i) {
            DFS(nodes[root][i], level + 1);
        }
}

int main() {
    while (scanf("%d", &nn) != EOF) {
        if (nn == 0) break;
        scanf("%d", &n_hasleaf);
        for (int i = 0; i < n_hasleaf; ++i) {
            int father, cnt, child;
            scanf("%d%d", &father, &cnt);
            for (int j = 0; j < cnt; ++j) {
                scanf("%d", &child);
                nodes[father].emplace_back(child);
            }
        }
    }
    DFS(1, 0);
    for (int i = 0; i <= Mlevel; ++i) {
        printf("%d", level_leaf_cnt[i]);
        if (i < Mlevel) printf(" ");
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,498评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,668评论 3 406
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,857评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,305评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,308评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,747评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,078评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,080评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,649评论 1 327
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,644评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,760评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,352评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,076评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,490评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,651评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,353评论 3 383
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,828评论 2 367