OJ_树的高度

本文介绍如何使用C++实现广度优先搜索(BFS)算法解决看似关于树的问题,实际上是图的邻接表表示,通过BFS队列和distance数组计算从根节点到其他节点的最大距离。
摘要由CSDN通过智能技术生成

题干

在这里插入图片描述

C++实现

  • 看似考察树,实则考察图。因为父子关系不清晰
  • 可以把树看成图的特例
  • 邻接表法存储
  • 从根出发,使用BFS
  • visited[]数组,记录某个结点是否访问过
#include <stdio.h>
#include <iostream>
#include <queue>
using namespace std;

int main() {
    int n,m;
    scanf("%d%d",&n,&m);
    vector<vector<int>> tree(n+1);//从1~n+1,不使用下标0

    for(int i = 0; i < n-1; ++i) {
        int u,v;
        scanf("%d%d",&u,&v);
        tree[u].push_back(v);//u的邻居是v
        tree[v].push_back(u);//v的邻居是u
    }

    queue<int> toVisit;//用作BFS队列
    vector<int> distance(n+1);//用来判断某个结点是否访问过,若访问过,还可以记录根结点到该结点距离
    int maxDist = 0;

    for(int i = 1; i < n; ++i) {
        distance[i] = -1;//-1表示没有被访问过
    }

    distance[m] = 0;//根结点到根结点的距离为0

    toVisit.push(m);//先把根入队

    while(toVisit.empty() == false) {
        int cur = toVisit.front();
        toVisit.pop();

        for(int i = 0;i < tree[cur].size(); ++i){
            int child = tree[cur][i];
            if(distance[child] != -1){//说明被访问过了
                continue;
            }
            toVisit.push(child);
            distance[child] = distance[cur] + 1;
            maxDist = distance[child];
        }
    }

    printf("%d\n",maxDist);
    system("pause");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值