链式前向星存树图和遍历它的两种方法【dfs、bfs】

2023-11-17

目录

一、链式前向星存图

二、两种遍历方法


一、链式前向星存图:(n个点,n-1条边)

链式前向星把上面的树图存下来,输入:

9 ///代表要存进去n个点
1 2  ///下面是n-1条边,每条边连接两个点
1 3
1 7
2 4
4 5
4 6
3 8
3 9

1、先把链式前向星想成链表,建成后(存双向边):

(数字代表竖线前的点与后面的点相连,1-2、1-3 都是表示边。 注意:链表并不是只建立一条,而是对每个点都建且只建一个

2、因为链表的建立或者是插入都不是特别简单,直接用链表不太可行,链式前向星就是用数组模拟的链表(就像队列、单调栈都是用数组模拟的,比较简单)。

链表包含head指针和data,因此用数组head[]代替指针,用结构体edge[]代替data存放数据。

a.建立结构体edge[]:

struct node{
    int to; ///相连的的点的id
    int next; ///指针(说指针可能听不懂,看完就知道了)
}edge[MAX+5];

b.为了便于链表的遍历,要给数组head[]赋初值-1:

void init()
{
    memset(head,-1,sizeof(head));
    ans=0; ///ans表示总共n-1条边,现在建到第ans条边了。
}

 3、模拟链表的建立和插入:

往链表中存进去一条边,若原来没有这个点的链表那就要新建一条边,不然就是往已有的链表中插入一条边。

a.新建一条链表:

例如要建1-2这条边:(因为前面没建立点1的链表,所以要新建一个链表)

1)、将数据存入结构体edge中: 

2)):将指针指向这个链表:

所以如果想知道1这个点的链表存了什么内容,结构体 edge[head[1]] 中存的就是,所以前面说head[]是个指针。

2、往已经存在的链表中插入一条边:

例如要建1-3这条边:(因为前面建立了点1的链表,所以要把这个边插进去)

1)、把数据存入结构体edge中:

2)、指针指向该链表块:

这样就把链表建好了!!!

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAX=2e5;
struct node{
    LL to;
    LL next;
}edge[MAX+5];
LL n,ans;
LL head[MAX+5];
void addedge(LL u,LL v)
{
    edge[ans].to=v;
    edge[ans].next=head[u];
    head[u]=ans++;
}
void init()
{
    memset(head,-1,sizeof(head));
    ans=0;
}

int main()
{
    init(); ///链式前向星存图千万不要忘记先把数组head初始化
    cin>>n;
    for(LL i=0;i<n-1;i++){
        LL u,v;
        cin>>u>>v;
        addedge(u,v);
        addedge(v,u);
    }
    return 0;
}

二、两种遍历方法:

   感谢:布衣书生real

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAX=2e5;
struct node{ ///下面是链式前向星存图
    LL to;
    LL next;
}edge[MAX+5];
LL n,ans;
LL head[MAX+5];
void addedge(LL u,LL v)
{
    edge[ans].to=v;
    edge[ans].next=head[u];
    head[u]=ans++;
}
void init()
{
    memset(head,-1,sizeof(head));
    ans=0;
}
LL cnt;
LL num[MAX+5];
bool vis[MAX+5];
void dfs(int u) ///递归实现深度优先搜索
{
    printf("%d ",u);
    vis[u]=true;
    for(int i=head[u];~i;i=edge[i].next){
        int to=edge[i].to;
        if(!vis[to]){
            dfs(to);
        }
    }
}

void bfs(int u) ///队列实现广度优先搜索
{
    queue<int>q;
    vis[u]=true;
    q.push(u);
    while(!q.empty()){
        int k=q.front();
        q.pop();
        printf("%d ",k);
        for(int i=head[k];~i;i=edge[i].next){
             int to=edge[i].to;
             if(!vis[to]){
                q.push(to);
                vis[to]=true; ///因为不是递归实现,所以每次放入队列后都需要立即标记。
             }
        }
    }
}

int main()
{
    init();
    cin>>n;
    for(LL i=0;i<n-1;i++){
        LL u,v;
        cin>>u>>v;
        addedge(u,v);
        addedge(v,u);
    }
    cout<<"dfs:"<<endl;
    dfs(1);
    memset(vis,false,sizeof(vis));
    cout<<endl<<"bfs:"<<endl;
    bfs(1);
    printf("\n");
    cout<<endl;
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链式前向星存树图和遍历它的两种方法【dfs、bfs】 的相关文章

  • Tempter of the Bone【DFS+奇偶剪枝】scanf会WA!!!

    题目链接HDU1010 多好的一道题 交scanf会WA cin一发过 我WA了30 次 惊是这样的BUG 我就说我推的公式怎会错呢 如果有字体缩小的方式 我要把上面那行缩小些 先看大家WA 可真是一道有趣的题目 首先 有这样的图推出奇偶剪
  • Acwing-1112. 迷宫

    include
  • Kamil and Making a Stream【Codeforces Round #588 (Div. 2) E】【dfs + map】

    Codeforces 1230 E 也没怎么读题 就看了下样例的note就知道了是对树上的直系祖先对子结点的链上gcd求和 然后就可以直接这样去跑一遍 个人比较的喜欢踩坑 有正着走的不走 偏偏选择了从根节点返回回来的答案 这样的做法虽然上是
  • DFS时间复杂度

    DFS算法是一一个递归算法 需要借助一个递归工作栈 故它的空间复杂度为 O N O N O N 遍历图的过程实质上是对每个顶点查找其邻接点的过程 其耗费的时间取决于所采用结构 邻接表表示时 查找所有顶点的邻接点所需时间为
  • 洛谷题单 算法1-7 搜索

    USACO08FEB Meteor Shower S 题目描述 Bessie hears that an extraordinary meteor shower is coming reports say that these meteor
  • 学渣带你刷Leetcode0017. 电话号码的字母组合

    题目描述 给定一个仅包含数字 2 9 的字符串 返回所有它能表示的字母组合 给出数字到字母的映射如下 与电话按键相同 注意 1 不对应任何字母 示例 输入 23 输出 ad ae af bd be bf cd ce cf 说明 尽管上面的答
  • UVA12166 Equilibrium Mobile

    VJ传送门 一道思维题 刚开始看的时候没什么思路 在博客园上参考了大佬的解析 在这里总结一下 一 分析 这道题要求让天平平衡所需要的最小改动次数 至少有一个不变 我们可以先选定一个不变的基准 然后改变其他的秤砣 得到以此为基准的天平的总重量
  • 02 二叉树的DFS(前序、中序或后序遍历实现)【Binary Tree 二叉树】

    二叉树的深度优先遍历主要有三种 前序 根左右 中序 左根右 后序 左右根 下面是完整的实现和讲解 include
  • [LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS

    目录 1 Binary Tree Level Order Traversal 二叉树层次遍历 BFS 2 Binary Tree Level Order Traversal II 二叉树层次遍历从低往高输出 BFS 3 Maximum De
  • 图论 笔记

    关于存图 如果是有权值的边 可以用pair define pii pair
  • poj 3074 Sudoku

    Time Limit 1000MS Memory Limit 65536K Total Submissions 7613 Accepted 2696 Description In the game of Sudoku you are giv
  • [Wikioi 2808][NOIP 1998普及组]二的幂次方---HBNU的童鞋过来看看

    题目描述 Description 任何一个正整数都可以用2的幂次方表示 例如 137 2 7 2 3 2 0 同时约定次方用括号来表示 即a b可表示为a b 由此可知 137可表示为 2 7 2 3 2 0 进一步 7 2 2 2 2 0
  • LeetCode-116.填充每个节点的下一个右侧节点指针、深度优先搜索

    题目分析 广度优先搜索 题目要求把二叉树中每一层的的节点连起来 最简单的方法即 BFS 按层的顺序的对树进行遍历 但需要使用 queue 数据结构 空间复杂度为 O N 不符合题目要求 深度优先搜索 由于 next 指针的存在 可以实现对二
  • 图的深度优先遍历:DFS遍历

    图的深度优先遍历 DFS遍历 提示 系列图的文章 提示 大厂笔试面试都可能不咋考的数据结构 图 由于图的结构比较难 出题的时候 很难把这个图的数据搞通顺 而且搞通顺了题目也需要耗费太多时间 故笔试面试都不会咋考 笔试大厂考的就是你的贪心取巧
  • CentOS 7.9 64位 SCC版安装FastDfs和配置Nginx

    最近练习的项目中需要用到FastDfs 和Nginx 这里记录一下安装和配置过程 个人使用部署过程遇到了很多的坑 准备把过程记下来不然忘了 首先 购买 试用阿里云 CentOS 7 9 64位Scc版系统 进入远程桌面 由于项目较老 所以我
  • 牛客剑指offer之【JZ12 矩阵中的路径】

    哈喽 这次真的是好久不见呀 我回来啦 接下来的日子我会不断更新牛客上的剑指offer题解 为什么这么做呢 是因为博主刷题总是刷了忘忘了刷 一样的题目换种形式就要做好久 说到底还是对知识点的理解不够透彻 加之算法对一个即将找工作的大学生来说更
  • c++ vector基本函数、排序、查找用法

    终于把自己的个人博客安排上啦 欢迎访问我的个人博客 XJHui s Blog vector用法目录 1 基本用法 2 vector的删除操作 3 vector的sort排序 4 翻转vector中的所有元素 5 find 函数的用法 6 v
  • LeetCode——1302. 层数最深叶子节点的和

    题目描述 给你一棵二叉树的根节点 root 请你返回层数最深的叶子节点的和 示例 1 输入 root 1 2 3 4 5 null 6 7 null null null null 8 输出 15 示例 2 输入 root 6 7 8 2 7
  • 基于振动传感器数据构建预测性维护AI模型

    预测性维修 Predictive Maintenance 简称PdM 是以状态为依据 Condition Based 的维修 在机器运行时 对它的主要 或需要 部位进行定期 或连续 的状态监测和故障诊断 判定装备所处的状态 预测装备状态未来
  • DFS的个人理解和测试例题

    深度优先搜索 DFS 是一种搜索手段 可以理解为 它从某个位置 起点 开始 沿着一条路不断地向前走直到尽头 然后退后一步 去走其它没走过的路 没有的话 再退后一步 再去选择 直到找到目的地 终点 例如下图 从A 起点 开始走 先走ABD 在

随机推荐

  • 读写ini配置文件(C++)

    文章目录 1 为什么要使用ini或者其它 例如xml json 配置文件 2 ini文件基本介绍 3 ini配置文件的格式 4 C 读写ini配置文件 5 代码示例 6 配置文件的解析库 文章转载于 https blog csdn net
  • Proteus中继电器详解

    目录 一 引言 二 继电器实物 三 Proteus继电器选择 四 继电器工作原理及Proteus中继电器引脚 五 Proteus中继电器正确接法举例及仿真视频记录 一 引言 我们都知道继电器可以利用小信号控制大功率 有四两拨千斤功效 同时还
  • 一些关于TV的概念

    文章目录 TTX FVP BML MTS BTSC 一些关于TV的属于解释 TTX TTX是一种电视机上的文字广播系统 可以在电视屏幕上显示文字信息 如新闻 天气预报 股票行情 电视剧剧情介绍等 它是通过电视信号的一部分传输的 不需要额外的
  • springboot 2.0.4 关闭程序————我走过的那些坑

    首次接触springboot项目 在本地测试的时候 发现不知道怎么关闭程序 虽然后来不得不用杀死进程的方式解决 但总觉得这种方式太简单粗暴 就准备问问度娘别人都是怎么做的 结果普遍答案是 步骤 第一步 引入依赖
  • 中央和省级产业政策匹配数据(含完整stata代码)

    1 数据来源 国泰安数据库 2 时间跨度 中央产业政策 2001 2020年 和省份产业政策 2006 2020年 3 区域范围 全国 4 指标说明 具体匹配代码详见分享文件中的do文件 匹配流程 1 整理证监会2001年分类标准和证监会2
  • Python 进阶(七): Word 基本操作

    1 概述 Word 是一个十分常用的文字处理工具 通常我们都是手动来操作它 本节我们来看一下如何通过 Python 来操作 Python 提供了 python docx 库 该库就是为 Word 文档量身定制的 安装使用 pip insta
  • openwrt 格式化_如何在路由器上格式化 U 盘、硬盘

    本教程适用于梅林 padavan LEDE openwrt 等固件 以下具体方法都基于 ext4 NTFS 相关错误不做回答 使用ssh连接路由器 把U盘插到路由器上 我们需要在命令行进行以下4步操作 安装fdisk 一般梅林 Padava
  • Keil(MDK-ARM-STM32)系列教程(六)Configuration(Ⅱ)

    写在前面 本文接着上一篇文章 Configuration 进行讲述Configuration后面三项Shortcut Keys快捷键 Text Completion代码完形 Other其他的内容 Shortcut Keys快捷键 Keil软
  • 精学JS:宏任务 & 微任务的运行机制

    首先分析宏任务和微任务的运行机制 并针对日常开发中遇到的各种宏任务 微任务的方法 结合一些例子来看看代码运行的顺序逻辑 把这部分知识点重新归纳和梳理 在日常开发中 例如 setTimeout和 promise都是经常会使用到的 JS方法 当
  • 操作系统【六】虚拟内存

    传统存储管理方式的不足 一次性 作业必须一次性全部装入内存后才能开始运行 这会造成 当作也很大时不能全部装入内存 当大量作业要求运行时 由于内存无法容纳所有作业 因此只有少量作业能够运行 导致多道程序并发度下降 驻留性 一旦作业被装入内存
  • 【计算机视觉】Visual Transformer (ViT)模型结构以及原理解析

    文章目录 一 简介 二 Vision Transformer如何工作 三 ViT模型架构 四 ViT工作原理解析 4 1 步骤1 将图片转换成patches序列 4 2 步骤2 将patches铺平 4 3 步骤3 添加Position e
  • Python——LSTM、GRU 时间序列股票数据预测(文末完整代码)

    GRU 是在 LSTM 基础上的简化 将 LSTM 内部的三个闸门简化成两个 往往 GRU 的计算效果会优于 LSTM 目录 1 导入工具包 2 获取数据集 3 数据预处理 4 时间序列滑窗 5 数据集划分 6 构造网络模型 7 网络训练
  • tracert命令返回的三个时间为什么有时会出现1个或2个星号?

    如图 三个时间里有1个或者2个显示星号 这是为什么呢 如果是配置了ACL丢弃了响应报文的话按理应该3个都显示星号呀 直接ping这个ip的话不会出现丢包 时延也很稳定 这个问题很诡异 演绎一下 仅供参考 首先traceroute 是利用 T
  • 后台系统切换主题颜色(换肤) Vue+ elementUi

    文章目录 前言 一 css color function 二 使用步骤 1 下载依赖项 2 引入 3 使用 定义data数据 3 定义方法 4 调用方法使用 5 模板 6 AllCode 总结 前言 不断学习demo中 有好的demo会记录
  • antd pro protable request请求有数据 页面不渲染或postdata里的data一直是undefined

    异常原因 protable的request请求默认的数据格式为 data pageSize 10 current 1 total 28 success true request请求如果返回的数据格式不是以上形式就会获取不到data page
  • STM32 DMA 应用之(二) DMA 串口 数据传输--发送

    一 DMA请求映像 由此我们知道如果需要使用串口1的发送功能需要用到的是DMA1 Channel4 使用串口1的接收功能需要用到的是DMA1 Channel5 二 怎样配置软件来使用DMA 把数据传到串口发送 1 配置dma 函数名称 Dm
  • vim退出时提示:q:未找到命令的解决办法

    有一天 我在WSL上快乐的用vim编游戏 可就在我输入 q时 bash提醒我 q 未找到命令 平常程序都在WSL上 cat不自动在行尾加换行违反了我的强迫症 然后我就开始修理vim了 然后我又试了 wq等等和q有关的命令 甚至连 q都没问题
  • C#编程,.NTE调用java类、jar包方法

    基本思路 用C 实现调用Java编写的类中的方法 重点是将Java编写的程序打包成Jar 然后使用开源工具IKVM将其转化成DLL控件 在 NET环境下调用 一 使用IKVM NET组件 首先到IKVM官网 http www ikvm ne
  • React学习(JSX+组件+state+表单)

    React JSX 声明元素 渲染元素 组件 练习 this props children PropTypes 默认值 获取真实的DOM节点 this state 表单 组件的生命周期 例子 JSX JSX是一种JavaScript语法的拓
  • 链式前向星存树图和遍历它的两种方法【dfs、bfs】

    目录 一 链式前向星存图 二 两种遍历方法 一 链式前向星存图 n个点 n 1条边 链式前向星把上面的树图存下来 输入 9 代表要存进去n个点 1 2 下面是n 1条边 每条边连接两个点 1 3 1 7 2 4 4 5 4 6 3 8 3