当前位置: 首页 > article >正文

【6】拓扑排序学习笔记

前言

有向无环图和拓扑排序直接关联到中后期的图论建模思想,是很重要的基础知识。这个如果不彻底弄懂,以后图论会很困难。

有向无环图

正如其名,一个边有向没有环的图,也叫DAG。

DAG图实际运用:描述含有公共子式的表达式及工程系统的进行过程时的有效工具。

一个较大的工程被分成若干个子工程,这些子工程被称作活动。活动之间存在某种约束关系,用有向边来表示。

关心的问题:

1 1 1 :工程能否顺利进行

2 2 2 :估算整个工程完成所需要的最短时间

拓扑排序

用于在一个DAG表示的工程的的前后驱约束关系中,对完成活动的先后进行排序,使工程顺利进行。

拓扑排序的步骤:

1 1 1 :选择图中所有入度为 0 0 0 的点,加入栈/队列。

2 2 2 :取出栈顶/队首的点加入拓扑序列末尾,删除这个点以及其出边(出边所到点的入度减 1 1 1 ),弹栈/队列。

3 3 3 :在出边到达的点中选择入度为 0 0 0 的点,加入栈/队列。

4 4 4 :重复 2 ∼ 3 2\sim3 23 ,直到栈/队列空。

如果拓扑排序结束后拓扑序列有 n n n n n n 为图的顶点数)个元素,那么图中无环;否则,图中必定存在环。

时间复杂度: O ( n + m ) O(n+m) O(n+m)

void topo_sort()
{int sta[300000],top=0;for(int i=1;i<=n;i++)if(ind[i]==0)sta[++top]=i;while(top){int now=sta[top];top--;for(int i=h[now];i;i=e[i].next){ind[e[i].v]--;if(ind[e[i].v]==0)sta[++top]=e[i].v;}ou[++ans]=now;}
}

拓扑排序例题

例题 1 1 1

B3644 家谱树

拓扑排序板子题,不多赘述。

#include <bits/stdc++.h>
using namespace std;
struct edge
{int v,next;
}e[300000];
int n,m,h[300000],cnt=0,ans=0,ind[300000],ou[300000];
void add_edge(int u,int v)
{e[++cnt].v=v;e[cnt].next=h[u];h[u]=cnt;ind[v]++;
}void topo_sort()
{int sta[300000],top=0;for(int i=1;i<=n;i++)if(ind[i]==0)sta[++top]=i;while(top){int now=sta[top];top--;for(int i=h[now];i;i=e[i].next){ind[e[i].v]--;if(ind[e[i].v]==0)sta[++top]=e[i].v;}ou[++ans]=now;}
}int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){int t=-1;while(t!=0){scanf("%d",&t);if(t==0)break;add_edge(i,t);}}topo_sort();if(ans!=n)printf("-1");else for(int i=1;i<=ans;i++)printf("%d ",ou[i]);return 0;
}

例题 2 2 2

U141986 奖金

前置知识:【6*】差分约束系统学习笔记

以每个人的奖金数为点构造差分约束系统,由于题目要求至少,需要求最长路,由于边权只有 1 1 1 ,可以通过拓扑排序直接求解最长路。

#include <bits/stdc++.h>
using namespace std;
struct edge
{int v,next;
}e[300000];
int n,m,h[300000],cnt=0,ans=0,ind[300000],ou[300000],dis[300000],sum=0;
void add_edge(int u,int v)
{e[++cnt].v=v;e[cnt].next=h[u];h[u]=cnt;ind[v]++;
}void topo_sort()
{int sta[300000],top=0;for(int i=0;i<=n;i++)if(ind[i]==0)sta[++top]=i;while(top){int now=sta[top];top--;for(int i=h[now];i;i=e[i].next){ind[e[i].v]--;dis[e[i].v]=max(dis[e[i].v],dis[now]+1);if(ind[e[i].v]==0)sta[++top]=e[i].v;}ou[++ans]=now;}
}int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);add_edge(y,x);}for(int i=1;i<=n;i++)dis[i]=-1;dis[0]=99;for(int i=1;i<=n;i++)add_edge(0,i);topo_sort();if(ans!=n+1)printf("Poor Xed");else{for(int i=1;i<=ans;i++)sum+=dis[i];printf("%d",sum);}return 0;
}

例题 3 3 3

P1983 [NOIP2013 普及组] 车站分级

图论建模题目,第一眼看上去像DP。

由于在一段内,车所经过的车站必然比没有经过的车站优先级高,利用这一点可以以每个车站的优先级为点构造差分约束系统,由于题目要求最少,需要求最长路,同时边权依旧只有 1 1 1 ,可以直接使用拓扑排序。

至于建边,可以把有效行程之内未经过的车站到每一个经过了的车站建一条边,表示一个大于关系。同时这样可能会有很多重边,可以通过记忆化,排除冗余。

当然,此题有复杂度更优秀的做法,可以参考其他题解。

#include <bits/stdc++.h>
using namespace std;
struct node
{int v,next,dis;
}e[1000010];
int n,m,s,h[1010],cnt=0,z[1010],book[1010],dis[1010],ind[1010],vis[1010][1010],ans=0;
void add_edge(int f,int v,int dis)
{e[++cnt].next=h[f];e[cnt].v=v;e[cnt].dis=dis;h[f]=cnt;ind[v]++;
}void topo_sort()
{int sta[300000],top=0;for(int i=0;i<=n;i++)if(ind[i]==0)sta[++top]=i;while(top){int now=sta[top];top--;for(int i=h[now];i;i=e[i].next){ind[e[i].v]--;dis[e[i].v]=max(dis[e[i].v],dis[now]+e[i].dis);if(ind[e[i].v]==0)sta[++top]=e[i].v;}}
}int main()
{scanf("%d%d",&n,&m);for(int i=0;i<m;i++){scanf("%d",&s);for(int j=0;j<s;j++)scanf("%d",&z[j]);for(int j=0;j<s;j++)book[z[j]]=1;for(int k=0;k<s;k++)for(int j=z[0];j<=z[s-1];j++)if(!book[j]&&!vis[j][z[k]]){add_edge(j,z[k],1);vis[j][z[k]]=1;}memset(book,0,sizeof(book));}for(int i=1;i<=n;i++)add_edge(0,i,0);for(int i=1;i<=n;i++)dis[i]=-99999999;dis[0]=0;topo_sort();for(int i=1;i<=n;i++)ans=max(ans,dis[i]);printf("%d",ans+1);return 0;
}

后记

一篇教练推荐的博客,写在这里,提供参考:

拓扑排序(Topological Sorting)

相关文章:

【6】拓扑排序学习笔记

前言 有向无环图和拓扑排序直接关联到中后期的图论建模思想&#xff0c;是很重要的基础知识。这个如果不彻底弄懂&#xff0c;以后图论会很困难。 有向无环图 正如其名&#xff0c;一个边有向&#xff0c;没有环的图&#xff0c;也叫DAG。 DAG图实际运用&#xff1a;描述含…...

珠算之加减法中出现负数情况

在珠算加减法过程中出现负数情况的处理 如果数字 A 小于 B&#xff0c;要求计算 A-B&#xff0c;此时出现了小数减大数的情况&#xff0c;其结果应该是负数。 在平时&#xff0c;计算 A-B 时&#xff0c;如果发现 A 小于 B&#xff0c;则计算时只要计算 B-A&#xff0c;结果记…...

使用Python在Word中生成多种不同类型的图表

目录 工具与环境配置 在 Word 中创建图表的步骤 在Word中创建柱形图 在Word中创建条形图 在Word中创建折线图 在Word中创建饼图 在Word中创建散点图 在Word中创建气泡图 在 Word 文档中插入图表不仅能更直观地呈现数据&#xff0c;还能提升文档的可读性和专业性。常见的…...

pycharm + anaconda + yolo11(ultralytics) 的视频流实时检测,保存推流简单实现

目录 背景pycharm安装配置代码实现创建本地视频配置 和 推流配置视频帧的处理和检测框绘制主要流程遇到的一些问题 背景 首先这个基于完整安装配置了anaconda和yolo11的环境&#xff0c;如果需要配置开始的话&#xff0c;先看下专栏里另一个文章。 这次的目的是实现拉取视频流…...

Netty基础—5.Netty的使用简介

大纲 1.Netty服务端的启动流程 2.服务端IO事件的处理类 3.Netty客户端的启动流程 4.客户端IO事件的处理类 5.启动Netty服务端和客户端的方法说明 6.Netty服务端和客户端使用总结 7.什么是TCP粘包拆包 8.TCP粘包拆包的几种情况 9.TCP粘包拆包的原因 10.粘包问题的解决…...

C++初阶——类和对象(一)

C初阶——类和对象&#xff08;一&#xff09; 一、面向过程和面向对象 1.面向过程 面向过程的程序设计&#xff08;Procedure-Oriented Programming&#xff09;&#xff0c;简称POP&#xff0c;是一种是以程序执行流程为核心的编程范式。它是先分析出解决问题所需要的的步…...

1141. 【贪心算法】排队打水

题目描述 有n&#xff08;n<1000&#xff09;个人在一个水龙头前排队接水&#xff0c;假如每个人接水的时间为Ti&#xff0c; 请编程找出这n个人排队的一种顺序&#xff0c;使得n个人的平均等待时间最小。输入 输入文件共两行&#xff0c;第一行为n&#xff1b; 第二行分别…...

RabbitMQ入门:从安装到高级消息模式

文章目录 一. RabbitMQ概述1.1 同步/异步1.1.1 同步调用1.1.2 异步调用 1.2 消息中间件1.2.1 概念1.2.2 作用1.2.3 常见的消息中间件1.2.4 其他中间件 1.3 RabbitMQ1.3.1 简介1.3.2 特点1.3.3 方式1.3.4 架构1.3.5 运行流程 二. 安装2.1 Docker 安装 RabbitMQ 三. 简单队列&…...

Linux应用:进程的回收

进程的诞生和消亡 程的诞生通常是通过系统调用&#xff08;如fork、exec等&#xff09;来创建新进程。当一个进程完成其任务或者出现错误时&#xff0c;它会进入消亡阶段。进程可以通过exit函数主动结束自身&#xff0c;也可能由于操作系统的调度策略&#xff08;如资源耗尽、…...

如何利用 AI 技术快速定位和修复生产环境问题

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

Linux find 命令完全指南

find 是 Linux 系统最强大的文件搜索工具&#xff0c;支持 嵌套遍历、条件筛选、执行动作。以下通过场景分类解析核心用法&#xff0c;涵盖高效搜索、文件管理及高级技巧&#xff1a; 一、基础搜索模式 1. 按文件名搜索&#xff08;精确/模糊匹配&#xff09; <BASH> f…...

市场波动中的风险管理与策略优化

市场波动中的风险管理与策略优化 在市场交易中&#xff0c;价格的波动性为投资者提供了交易机会&#xff0c;但同时也带来了风险。如何在市场不确定性中进行有效的风险管理&#xff0c;并优化交易策略&#xff0c;是每位交易者都需要思考的问题。本文将探讨市场波动的影响因素、…...

(链表)206. 反转链表

给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; 输入&am…...

Jetson Orin NX jupyter lab的安装和使用

主要是为了梳理一下整个过程&#xff0c;其实步骤很简单&#xff0c;但容易出错。 注意&#xff0c;实际只有两个文件需要写入&#xff0c;一个是jupyter_lab_config.py&#xff0c;一个是jupyter.service。 配置文件的名字要写对&#xff0c;如果总是copy网上的代码&#xff0…...

前端npm包- CropperJS

文章目录 一、CropperJS**核心特性****官网与文档****安装与使用**1. **通过 npm/yarn/pnpm 安装**2. **HTML 结构**3. **引入 CSS 和 JS**4. **初始化裁剪器** **相关插件/替代方案****适用场景****注意事项** 总结 一、CropperJS cropperjs 是一个轻量级、功能强大的 图片裁…...

农业建设项目管理系统评测:8款推荐工具优缺点分析

本文主要介绍了以下8款农业建设项目管理系统&#xff1a;1.PingCode&#xff1b; 2. Worktile &#xff1b;3. 建米农业工程项目管理系统&#xff1b;4. 开创云数字农业管理平台&#xff1b; 5. Trimble Ag Software&#xff1b;6.Conservis&#xff1b; 7. Agworld &#xff1…...

linux 命令 tail

tail 是 Linux 中用于查看文件末尾内容的命令&#xff0c;常用于日志监控和大文件快速浏览。以下是其核心用法及常见选项&#xff1a; 基本语法 tail [选项] 文件名 常用选项 显示末尾行数 -n <行数> 或 --lines<行数> 指定显示文件的最后若干行&#xff08;…...

测试开发 - 正浩创新 - 一面面经(已OC)

自我介绍 实习过程中&#xff0c;有遇到过什么问题&#xff0c;是如何解决的 实习成果中的数据指标变化&#xff0c;人力消耗一直在递减&#xff0c;是什么原因 实习工作有很多模块&#xff0c;那一块工作对你的提升或者收获是比较大的 讲一下&#xff0c;简历中所罗列的几…...

实验8 搜索技术

实验8 搜索技术 一、实验目的 &#xff08;1&#xff09;掌握搜索技术的相关理论&#xff0c;能根据实际情况选取合适的搜索方法&#xff1b; &#xff08;2&#xff09;进一步熟悉盲目搜索技术&#xff0c;掌握其在搜索过程中的优缺点&#xff1b; &#xff08;3&#xff09;…...

VSTO(C#)Excel开发9:处理格式和字体

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

LinkedList底层结构和源码分析(JDK1.8)

参考视频&#xff1a;韩顺平Java集合 特点 LinkedList 底层实现了 双向链表 和 双端队列 的特点。可以添加任意元素&#xff08;元素可以重复&#xff09;&#xff0c;包括 null。线程不安全&#xff0c;没有实现同步。 LinkedList 底层结构 LinkedList 底层维护了一个双向链…...

数字内容体验的技术支柱是什么?

数据分析引擎构建基础 数字内容体验的技术底座始于对海量用户行为数据的深度解析。作为技术体系的根基&#xff0c;数据分析引擎通过实时采集、清洗与结构化处理&#xff0c;将分散的点击轨迹、停留时长及交互偏好转化为可操作的洞察。其核心能力体现在三方面&#xff1a;一是…...

C# 使用Markdown2Pdf把md文件转换为pdf文件

NuGet安装Markdown2Pdf库&#xff0c;可以把格式简单markdown文件转换为pdf。但该库用了Puppeteer Sharp&#xff0c;因此会在运行过程中提示指定Chrome浏览器路径或自动下载Chrome浏览器。 代码如下&#xff1a; using Markdown2Pdf;var converter new Markdown2PdfConverte…...

专家系统如何运用谓词逻辑进行更复杂的推理

前文&#xff0c;我们讲解了命题逻辑和谓词逻辑的基本概念、推理规则、应用以及一些简单的示例。具体内容可以先看我的文章&#xff1a;人工智能的数学基础之命题逻辑与谓词逻辑&#xff08;含示例&#xff09;-CSDN博客 那么形如专家系统这类复杂系统&#xff0c;是如何通过谓…...

html css网页制作成品——糖果屋网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

Ubuntu上部署Flask+MySQL项目

一、服务器安装python环境 1、安装gcc&#xff08;Ubuntu默认已安装&#xff09; 2、安装python源码 wget https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz 3、安装Python依赖库 4、配置python豆瓣源 二、服务器安装虚拟环境 1、安装virtualenv pip3.10 ins…...

落雪音乐Pro 8.8.6 | 内置8条音源,无需手动导入,纯净无广告

洛雪音乐Pro版内置多组稳定音源接口&#xff0c;省去手动导入的繁琐操作&#xff0c;安装即可畅听海量音乐。延续原版无广告的纯净体验&#xff0c;支持歌单推荐与音源切换&#xff0c;满足个性化听歌需求。此版本仅支持在线播放&#xff0c;无法下载音乐&#xff0c;且与原版不…...

什么是全栈?

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点下班 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 &#x1f4c3;文章前言 &#x1f537;文章均为学习工…...

一些docker命令

一、基础命令 查看 Docker 版本 docker --version 或 docker version&#xff1a;显示 Docker 客户端和服务器的版本信息。 查看 Docker 系统信息 docker info&#xff1a;显示 Docker 系统的详细信息&#xff0c;包括镜像、容器数量、存储驱动类型等。 Docker 服务管理 s…...

《DeepSeek 开源 DeepGEMM:开启AI计算新时代的密钥》:此文为AI自动生成

《DeepSeek 开源 DeepGEMM&#xff1a;开启AI计算新时代的密钥》&#xff1a;此文为AI自动生成 引言&#xff1a;AI 计算的新曙光 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最为耀眼的领域之一。从语音助手到自动驾驶&#xff0c;从图像…...