图的广度优先遍历 + 拓扑排序(笔记)

2023-11-01

广度优先遍历:

模板题

广度优先遍历的大体思路就是:每次扩展当前一步能到达的未标记的点加入队列中并标记,每次也从队列中拿出一个点进行扩展。

该题是让求最权值都相等的短路我们就可以利用广度优先搜索来求。

#include<bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const ll maxn = 1e6 + 5;
//book用来标记哪些点走过了
int idx,h[maxn],e[maxn],nex[maxn],book[maxn];
int n,m,a,b;
//插入函数
void add(int a,int b)
{
    e[idx] = b;
    nex[idx] = h[a];
    h[a] = idx++;
}
int bfs()
{
    queue<int> qu;
    //加入节点1
    qu.push(1);
    int temp;
    //标记节点1
    book[1] = 1;
    while(qu.size())
    {
    	//取出第队首节点
        temp= qu.front();
        //走到n了就停
        if(temp == n)
            break;
        //扩展下一个节点
        for(int i = h[temp]; i != 0; i = nex[i])
        {
            if(!book[e[i]])
            {
                //距离加一
                book[e[i]] = book[temp] + 1;
                qu.push(e[i]);
            }
        }
        qu.pop();
    }
    return book[n] - 1;
}
int main()
{
    idx = 1;
    cin >> n >> m;
    for(int i = 0; i < m; i++)
    {
        cin >> a >> b;
        add(a,b);
    }
    cout << bfs() << endl;
    return 0;
}

拓扑排序:

题目

先来说什么是拓扑序,假设有一个图G有n个节点,把这个节点按照一定的顺序进行排列,最终使图内任意一条边在这个序列中起点在终点之前。

举个例子:在这里插入图片描述
在这个图中1 2 4 3就是一个拓扑序而1 4 2 3就不是,因为4放在了2的前面而2是通向4的。

在来说一下什么是入度什么是出度入度就是指某一个点被指向的次数,比如上面图的节点3,入度就是2,而出度相反是指出的次数,比如节点2,出度就是1.

接下来就是思路了

思路

1.对于序列的第一个节点一定是没有入度的点,因为没有任何边指向它,所以我们可以把所有没有入度的点加入序列的前面。

2.加入之后,我们再想那么下面应该放什么呢,可以发现接下来的点应该是在刚才加入的节点之后,所以他们应该只能被前面的节点所指,那就好办了,我们可以把刚才那些节点所指向点的入度减一,如果减之后入度为零就加入序列。

3.这样的话我们就又确定了一波节点,我们可以再用这些点重复2的操作如此一来拓扑排序就完成了,我们发现这个过程可以使用一个队列来进行,而最终的结果恰巧也就是排好的这个序列(比较不严谨的说法)。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll maxn = 1e5 + 5;
//e为终点,qu是队列,eg是出度
ll cnt,ne[maxn],endd[maxn],h[maxn],eg[maxn],qu[maxn];
ll a,b,n,m;
void add(ll a, ll b)
{
    endd[cnt] = b;
    ne[cnt] = h[a];
    h[a] = cnt++;
}
int bfs()
{
    int he = 0,ed = -1,next;
    //找出无出度的边
    for(int i = 1; i <= n; i++)
        if(!eg[i])
        //加入队列
            qu[++ed] = i;
    //bfs扩展
    while(he <= ed)
    {
        next = qu[he++];
        for(int i = h[next]; i != 0; i = ne[i])
        {
            //指向的出度减少
            eg[endd[i]]--;
            //出度为零加入队列
            if(!eg[endd[i]])
                qu[++ed] = endd[i];
        }
    }
    //全部遍历就存在拓扑序返回1
    if(he == n)
        return 1;
    else
    {
        cout << ed << endl;
        return 0;
    }
}
int main()
{
    cin >> n >> m;
    cnt = 1;
    for(int i = 0; i < m; i++)
    {
        cin >> a >> b;
        add(a,b);
        //记录出度
        eg[b]++;
    }
    if(bfs())
    {
        //数组qu模拟队列剩下的就是拓扑序列了
        for(int i = 0; i < n; i++)
            cout << qu[i] << " ";
        cout << endl;
    }
    else
        cout << -1 << endl;
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图的广度优先遍历 + 拓扑排序(笔记) 的相关文章

  • 图的拓扑序列

    拓扑序列 拓扑序是按照点的先后顺序排列的 拓扑序列满足以下两点 1 每个顶点在序列中出现且只出现一次 2 若存在一条从顶点 A 到顶点 B 的路径 那么在序列中顶点 A 出现在顶点 B 的前面 拓扑序列只存在于有向无环图中 可以理解成一个将
  • 东北大学acm训练第五周

    include
  • 1600*B. Jumping Jack(数学&&找规律)

    解析 一直往右条 直到第一次超过 x 如果当前和目标点 p x为偶数 则 p x 2 的那一步向左跳 这样会少跳 p x 正好补在多跳的这一段 如果为奇数 则不能除2 则继续跳 直到距离为偶数即可 x和x答案一样 include
  • True Liars 【POJ - 1417】【种类并查集+0-1背包】

    题目链接 题目想要知道有P个好人 说真话的人 和Q个坏人 说假话的人 并且有N条信息 代表A说B是好人 yes 坏人 no 那么 在保证答案唯一的情况下输出这P个好人 并且最后的时候输出 end 否则 输出 no 坑点 答案唯一指的是最后你
  • 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)-RC-u5 树与二分图

    2022 RoboCom 世界机器人开发者大赛 本科组 省赛 RC u5 树与二分图 文章目录 2022 RoboCom 世界机器人开发者大赛 本科组 省赛 RC u5 树与二分图 题目描述 输入格式 输出格式 输入样例 输出样例 思路 A
  • 图论感想

    图论基础无非也就是图存储 遍历 有向图无向图的连通性 分为图联通和联通分量 有向图为强联通分量 割点与割边 本人目前还没有看网络流内容 只是大致知道是什么 觉得也是图论一部分 个人认为学东西应该大体了解一下所学内容 每学一个必要好好思考 最
  • 数据结构 图的应用

    文章目录 生成树 定义 性质 带权图的最小生成树 最小生成树的生成规则 最小生成树 Kruskal算法 步骤 最小生成树 Prim算法 步骤 最短路径 非负权值的单源最短路径 Dijkstra算法 目的 算法 存储空间 算法步骤 算法实现
  • hdu 5756:Boss Bo

    题目链接如下 Problem 5756 先用dfs确定每个节点的序号编号 并且可以获得每个节点可以包括的子树节点区间范围 再用线段树建立一棵树 在第一次建立的时候我们记录每个节点的深度 然后再进行一次dfs 这次dfs用来更新以不同节点为根
  • Codeforces Round 867 (Div. 3)(A题到E题)

    链接 Dashboard Codeforces Round 867 Div 3 Codeforces 头一次div3做出来四题 第五题也差临门一脚 赛后看到别人e题跟自己几乎一样的思路肠悔青了 还得练才行 A TubeTube Feed 签
  • Codeforces-1454E Number of Simple Paths(基环树-思维)

    题目大意 给你n个点 n条边 求图中简单路径的个数 题目思路 n个点n条边 那么图中一定有一个环 拿这个图来讲 我们将两点间的关系分为4种 1 两点都在环上 简单路径的个数为2 例如2与5 2 一个点在环上一个点不在环上 简单路径个数为2
  • 大学生团体天梯赛(第十届)

    题目地址 天梯赛 include
  • 2021级新生个人训练赛第38场

    问题 A chicken 题目描述 小 x 非常喜欢小鸡翅 他得知 NSC 超市为了吸引顾客 举行了如下的活动 一旦有顾客在其他超市找到更便宜的小鸡翅 NSC 超市将免费送给顾客 1000g 小鸡翅 小 x 为了尽可能的省钱 走遍了各大超市
  • A*算法 解决(有环图)第k短路径长度(C++)

    算法竞赛 file author jUicE g2R qq 3406291309 彬 bin 必应 一个某双流一大学通信与信息专业大二在读 brief 一直在算法竞赛学习的路上 copyright 2023 9 COPYRIGHT 原创技术
  • Financial Crisis【点双连通分量】

    题目链接 HDU 3749 你以为学了Tarjan会写几个边双就真的理解什么是双连通分量了吗 我原来真的不懂什么叫做点双BCC 不过这都没有关系 解决了这个问题之后 我终于知道了什么叫做点双连通分量了 这是一个绝对绝对经典的问题 首先讲一下
  • 1600*D. Road Map(数学

    解析 记录每个点的父节点和子节点 从新的根节点开始遍历 遍历所有的非父结点即可 include
  • King's Quest【POJ 1904】【Tarjan强连通分量】

    Once upon a time there lived a king and he had N sons And there were N beautiful girls in the kingdom and the king knew
  • Summer Holiday HDU - 1827 强连通分量+缩点

    To see a World in a Grain of Sand And a Heaven in a Wild Flower Hold Infinity in the palm of your hand And Eternity in a
  • 图论算法<三>:判断有向图中是否有存在循环 ,以及环的个数和各个环中的元素

    1 目的 判断有向图中是否有存在循环 以及环的个数和各个环中的元素 2 示例效果 2 1 原始数据 路线起终点整理如下 共计12个顶点 19条边 起点 终点 1 最后的1代表起点终点是连通的 起点 终点 1 2 4 1 起点 终点 1 9
  • 1345:香甜的黄油(Dijkstra)---信息学奥赛一本通

    题目描述 农夫John发现做出全威斯康辛州最甜的黄油的方法 糖 把糖放在一片牧场上 他知道N 1 N 500 只奶牛会过来舔它 这样就能做出能卖好价钱的超甜黄油 当然 他将付出额外的费用在奶牛上 农夫John很狡猾 像以前的巴甫洛夫 他知道
  • 2023杭电暑假多校4 题解

    3 Simple Set Problem 题意 k 个多重集合 每个集合选出一个数形成新集合A 求 m a x A m

随机推荐

  • 人工智能ai算法_AI算法比您想象的要脆弱得多

    人工智能ai算法 In William Gibson s 2010 novel Zero History a character preparing to go in a high stakes raid wears an oddly pa
  • window像mac一样使用快捷键(AutoHotkey、SharpKeys和PowerToys)

    自己有win和mac两台笔记本 每天都需要在两台电脑切换进行开发 快捷键的差异就让人很难受 个人喜好mac快捷键 常用的几个快捷键分布比较合理 所以网上找来了解决方案供大家参考 我想作为一名 Mac User 使用 Win 首先感到不适应的
  • ####好好好#####时序数据库介绍和使用

    1 基础 1 1 时序数据的定义 什么是时间序列数据 Time Series Data TSD 以下简称时序 从定义上来说 就是一串按时间维度索引的数据 用描述性的语言来解释什么是时序数据 简单的说 就是这类数据描述了某个被测量的主体在一个
  • webpack3 CommonsChunkPlugin插件分离三方库(jQuery.js/vue.js等)和公共模块 分别打包

    需求 使用webpack进行打包时 我们不想自己写的js文件与第三方的js库一起打包成一个庞大的文件 而是想要第三方插件库单独打包一个js 我们自己写的js独立打包 优点 1 分割js文件避免单独一个js文件太大影响用户使用体验 2 通常来
  • fastdfs特点

    FastDFS是一个开源的轻量级分布式文件系统 它对文件进行管理 功能包括 文件存储 文件同步 文件访问 文件上传 文件下载 等 解决了大容量存储和负载均衡的问题 特别适合以文件为载体的在线服务 如相册网站 视频网站等等 FastDFS为互
  • 每个开发人员都应该知道的10个CSS选择器

    对于任何网站而言 要在用户上产生良好印象是什么 是的 它是任何网站的用户界面 每个开发人员都知道为用户创建美观的设计以便与任何网站进行交互非常重要 如果你不熟悉CSS及其选择器 那么在最短的时间内巧妙地对网页进行样式设置并不是一件容易的事
  • css中display属性作用大全

    定义和用法 display 属性规定元素应该生成的框的类型 实例 设置段落生成一个行内框 p inline display inline 使用说明 说明 这个属性用于定义建立布局时元素生成的显示框类型 对于 HTML 等文档类型 如果使用
  • 学习记录,利用canvas写扫雷游戏

    记录js学习后制作的第一关小游戏 这里的代码还不够精简 许多地方偷懒没有封装 逻辑也有许多可以优化 胜利条件 找出所有地雷并标记
  • XSS-labs靶场1-13关解法答案

    目录 XSS labs克隆 下载地址 第一关 解法 第二关 解法 第三关 解法 第四关 解法 第五关 解法 第六关 解法 第七关 解法 第八关 解法 第九关 解法 第十关 解法 第十一关 解法 第十二关 解法 第十三关 解法 从XSS pa
  • 关于利用python解压文件出现文件名乱码的问题

    利用python中的zipfile模块解压zip文件会出现文件名乱码的问题 会成为莫名的字符 例如 出现原因 zipfile模块中的源代码如下 if flags 0x800 UTF 8 file names extension filena
  • C++异常详解

    文章目录 前言 一 C语言传统的处理错误的方式 二 C 异常概念 三 异常的使用 3 1 异常的抛出和捕获 3 2 异常的重新抛出 3 3 异常安全 3 4 异常规范 四 C 标准库的异常体系 五 自定义异常体系 六 异常的优缺点 C 异常
  • 创建线程的第三种方式:实现Callable接口(含部分源码解析)

    创建线程的第三种方式 实现Callable接口 package com lqy Multithreading import java util concurrent Callable import java util concurrent
  • 递归和迭代的区别

    http blog csdn net laoyang360 article details 7855860 http www zhihu com question 20278387 深究递归和迭代的区别 联系 优缺点及实例对比 1 概念区分
  • JavaWeb核心技术(上)

    目录 第一章 Servlet核心技术 上 前端相关 1 1 基本概念 常识 1 1 1 C S架构的概念 1 1 2 B S架构的概念 1 1 3 JavaWeb的概念 1 2 HTTP协议 熟悉 1 2 1 HTTP协议的概念 1 2 2
  • Leetcode动态规划部分典型题目分类及总结

    参考内容 https leetcode cn com problems longest palindromic substring solution zhong xin kuo san dong tai gui hua by liweiwe
  • 创建vue脚手架时,npmERR报错的解决方法

    创建vue脚手架 1 我是刚学vue的小白 在安装vue脚手架的时候 遇到了安装时出现的问题 查阅了我几个小时 苦苦在挣扎着 确实难受 想借此机会把它给记录下来 希望能帮助更多的初学者解决疑惑 2 我在安装时遇到了这个问题 当时我一直在网上
  • Ubuntu安装nvidia显卡驱动,CUDA与CUDNN

    本文提到的文件可以在这里下载 链接 https pan baidu com s 1cfo0xqrXoK3pA4pHUN3Mcw 提取码 kdjq 目录 1 安装nvidia显卡驱动 2 安装CUDA 3 安装CUDNN 1 安装nvidia
  • [错误解决] paramiko.ssh_exception.SSHException: Error reading SSH protocol banner

    最近项目中需配置sftp上传下载 配置好环境后连接报错 报错信息如图 paramiko ssh exception SSHException Error reading SSH protocol banner 解决方式一 设置banner
  • 域名解析的查看

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 一 配置域名解析 DNS与Host 1 hosts文件 2 配置DNS 3 Host表解析与DNS机械的次序由文件 etc host conf决定 Hosts优先于DN
  • 图的广度优先遍历 + 拓扑排序(笔记)

    广度优先遍历 模板题 广度优先遍历的大体思路就是 每次扩展当前一步能到达的未标记的点加入队列中并标记 每次也从队列中拿出一个点进行扩展 该题是让求最权值都相等的短路我们就可以利用广度优先搜索来求 include