有向图的拓扑排序

文章目录

  • 概念及模板
  • 例题 杂务

概念及模板

有向图的拓扑排序是指将有向无环图中的所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u, v)在图中,则u在该序列中排在v的前面。

例如,假设有n个任务,这些任务需要按照一定的顺序执行,同时有些任务必须在其它任务完成之后才能执行,此时可以使用拓扑排序来确定任务的执行顺序,从而保证所有任务都能够被按照正确的顺序执行完成。
比如:生成一个可执行程序,需要经历预处理,编译,汇编,链接四步,后面的步骤必须在前面的步骤完成后才能执行。

一个有向无环图,一定至少存在一个入度为 0 的点(抽屉原理)
当有向图中,某个点的入度为 0 的时候,说明是没有一个点指向这个点的,那这个点就能作为起点指向其他点了,遍历结束后,这个点就可以删掉了(将 t 放在当前的最前面了),并将它指向的所有点的入度都减 1

  1. 定义一个队列,将所有入度为 0 的点入队
  2. 循环,每次取队头 t,枚举 t 的所有出边 j,将 d[j]-- ,如果减完后 d[j] == 0,就将这个点入队,重复前面的操作,那么只要这个图无环,就能依次将它的所有点突破掉
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 100010;
int n, m;
int e[N], ne[N], h[N], idx;
int ret[N], p; // 记录拓扑序的数组
int d[N]; // 记录每个点的入度度数
void add(int a, int b)
{e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
int to_polo()
{queue<int> q;for(int i = 1; i <= n; i++) if(!d[i]) // 将所有入度为 0 的点全部入队列 {q.push(i);ret[p++] = i;}while(q.size()){int t = q.front();q.pop();for(int i = h[t]; i != -1; i = ne[i]) // 遍历所有出边 {int j = e[i];d[j]--;if(d[j] == 0) // 如果等于 0, 就加入队列 {q.push(j);ret[p++] = j;}}}if(p != n) return -1;else return 1;
}
int main()
{cin >> n >> m;memset(h, -1, sizeof h);while(m--){int a, b;cin >> a >> b;add(a, b);d[b] ++;}int ans = to_polo();if(ans == -1) cout << -1;else {for(int i = 0; i < p; i++) cout << ret[i] << " ";}return 0;
}

例题 杂务

杂务

题目中出现的,某一任务必须在某些任务完成后才能完成,这就是拓扑排序的标志

此题只需要记录每个人物最快完成的时间即可:将所有入度为 0 的点放入队列,然后遍历所有出边,将遍历到的点的入度都减1,当一个点的入度减到 0 的时候,就可以加入队列。
加入队列后,这个点的最快时间就可以被更新了,最终答案在所有任务完成的最快时间中取最大值即可!

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 10100;
const int M = 100100;
int n;
int e[M], ne[M], h[N], idx;
int ti[N]; // id -> time 每个点所需要的时间
int Com[N]; // 记录每个点完成的最快时间 
int d[N]; // 记录某个点的入度个数 
int ans; // 答案
void add(int a, int b)
{e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
void to_polo()
{queue<int> q;for (int i = 1; i <= n; i++){if (d[i] == 0){q.push(i);Com[i] = ti[i];ans = max(ans, Com[i]);}}while (q.size()){int t = q.front();q.pop();for (int i = h[t]; i != -1; i = ne[i]){int j = e[i];Com[j] = max(Com[t], Com[j]); // 必须考虑最差情况d[j]--;if (!d[j]){Com[j] += ti[j];ans = max(ans, Com[j]);q.push(j);}}}cout << ans;
}
int main()
{memset(h, -1, sizeof h);cin >> n;for (int i = 1; i <= n; i++){int id, tim, tmp;cin >> id >> tim;ti[id] = tim;while (cin >> tmp){if (tmp == 0) break;add(tmp, id);d[id]++;}}to_polo();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS鸿蒙学习笔记(28)@entry和@Component的生命周期

entry和Component的生命周期 entry和Component的关系Component生命周期Entry生命周期 生命周期流程图生命周期展示示例代码参考资料 HarmonyOS的生命周期可以分为Compnent的生命周期和Entry的生命周期&#xff0c;也就是自定义组件的生命周期和页面的生命周期。 entry和Compone…

【传知代码】双深度学习模型实现结直肠癌检测(论文复现)

前言&#xff1a;在医学领域&#xff0c;科技的进步一直是改变人类生活的关键驱动力之一。随着深度学习技术的不断发展&#xff0c;其在医学影像诊断领域的应用正日益受到关注。结直肠癌是一种常见但危害极大的恶性肿瘤&#xff0c;在早期发现和及时治疗方面具有重要意义。然而…

快手发布大模型产品“可图”,超20种创新AI图像玩法限免上线

近日&#xff0c;快手自研大模型产品“可图”&#xff08;Kolors&#xff09;正式对外开放&#xff0c;支持文生图和图生图两类功能&#xff0c;已上线20余种AI图像玩法。目前&#xff0c;用户可以通过“可图大模型”官方网站和微信小程序&#xff0c;免费使用各项AI图像功能。…

纯分享#126个电商平台集合(包含60个不同国家)值得一看

01 亚洲 中国 淘宝&#xff1a;拥有大量的卖家和商品种类&#xff0c;主要面向中国市场。天猫:淘宝旗下的B2C电商平台&#xff0c;提供品质保证、正品保障的商品。京东:中国第二大B2C电商平台&#xff0c;提供品质保证、正品保障的商品。苏宁易购: 中国家电连锁巨头苏宁旗下的…

反VC情绪:加密市场需要新的分布式代币发行方式

GME事件 GME事件反应了社交媒体在金融决策中的影响力&#xff0c;散户投资者群体通过集体行动&#xff0c;改变了很多人对股市的看法和参与方式。 GME事件中&#xff0c;meme扮演了核心角色。散户投资者使用各种meme来沟通策略、激励持股行为&#xff0c;创造了一种反对华尔街…

【车载开发系列】汽车开发常用工具说明

【车载开发系列】汽车开发常用工具说明 【车载开发系列】汽车开发常用工具说明 【车载开发系列】汽车开发常用工具说明一. CANbedded二. Davinci Configurator Pro三. Davinci Developer-AUTOSAR软件组件设计工具四. MICROSAR五. MICROSAR OS六. CANdelaStudio七. Volcano VSB八…

Mysql基础教程(11):DISTINCT

MySQL DISTINCT 用法和实例 当使用 SELECT 查询数据时&#xff0c;我们可能会得到一些重复的行。比如学生表中有很多重复的年龄。如果想得到一个唯一的、没有重复记录的结果集&#xff0c;就需要用到 DISTINCT 关键字。 MySQL DISTINCT用法 在 SELECT 语句中使用 DISTINCT 关…

Spring Boot 项目中使用 JSP

文章目录 Spring Boot 项目中使用 JSP项目结构引入依赖包编写页面和后台运行方式一&#xff1a;Maven 命令运行方式二&#xff1a;在 IDEA 中运行方式三&#xff1a;打 war 包部署运行 Spring Boot 项目中使用 JSP 在 Spring Boot 项目中不是不可以使用 JSP 。想在 Spring Boo…

【React】封装一个好用方便的消息框(Hooks Bootstrap 实践)

引言 以 Bootstrap 为例&#xff0c;使用模态框编写一个简单的消息框&#xff1a; import { useState } from "react"; import { Modal } from "react-bootstrap"; import Button from "react-bootstrap/Button"; import bootstrap/dist/css/b…

打开C语言常用的内存函数大门(二)—— memmove()函数 (内含memmove的讲解和模拟实现)

文章目录 1. 前言2. memmove()函数2.1 memmove()函数与memcpy()函数的差异2.2 memmove()函数的原型2.3 memmove()函数的使用案例 3. memmove()函数的模拟实现4. 总结 1. 前言 在之前&#xff0c;我向大家介绍了C语言中的一个常用的内存函数memcpy函数。如果你还没看的话&#…

码随想录算法训练营Day 52 | 动态规划part13 | 300.最长递增子序列、674. 最长连续递增序列 、718. 最长重复子数组

代码随想录算法训练营Day 52 | 动态规划part13 | 300.最长递增子序列、674. 最长连续递增序列 、718. 最长重复子数组 文章目录 代码随想录算法训练营Day 52 | 动态规划part13 | 300.最长递增子序列、674. 最长连续递增序列 、718. 最长重复子数组300.最长递增子序列一、一维DP…

12k Star!Continue:Github Copilot 开源本地版、开发效率和隐私保护兼得、丰富功能、LLM全覆盖!

原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 12k Star&#xff01;Continue&#xff1a;Github Copilot 开源本地版、开发效率和隐私保护兼得、丰富功能、LLM全覆盖&#xff01; &…

Beamer中二阶导、一阶导数的显示问题

Beamer中二阶导、一阶导数的显示问题 在beamer中表示 f ′ f f′和 f ′ ′ f f′′时发现导数符号距离 f f f很近 \documentclass{beamer} \usepackage{amsmath,amssymb}\begin{document} \begin{frame}\frametitle{Derivative}Derivative:\[f^{\prime}(x) \quad f \quad…

C# 读取txt大文件

1GB以下 using System.Text;namespace DotnetReadTxt;class Program {static void Main(string[] args){try{Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);var gb2312 Encoding.GetEncoding("GB2312");int index 0;using (StreamReader sr ne…

conda与pip的镜像源与代理设置

conda与pip的镜像源与代理设置 一、前言二、conda镜像源设置2.1conda默认镜像源介绍2.2通过终端设置镜像源2.3通过配置文件设置镜像源 三、pip镜像源设置3.1pip默认镜像源介绍3.2通过终端临时设置镜像源3.3通过配置文件设置一个或多个镜像源 四、conda代理设置4.1通过终端设置代…

数据结构与算法笔记:基础篇 - 栈:如何实现浏览器的前进和后退功能?

概述 浏览器的前进、后退功能&#xff0c;你肯定很熟悉吧&#xff1f; 当依次访问完一串页面 a-b-c 之后&#xff0c;点击浏览器的后退按钮&#xff0c;就可以查看之前浏览过的页面 b 和 a。当后退到页面 a&#xff0c;点击前进按钮&#xff0c;就可以重新查看页面 b 和 c。但…

放开了去的 ulimit

放开了去的 ulimit 放开了去的 ulimitulimit简介临时修改打开文件数目永久修改系统总打开句柄限制更多信息 放开了去的 ulimit ulimit简介 对于高并发或者频繁读写文件的应用程序而言&#xff0c;有时可能需要修改系统能够打开的最多文件句柄数&#xff0c;否则就可能会出现t…

HTTPS 原理技术

HTTPS原理技术 背景简介原理总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内容并非完全原创&am…

Element-ui使用上传时弹框选择文件类型

实现效果 1&#xff0c;点击上传&#xff0c;上传文件&#xff1b; 2&#xff0c;选择文件&#xff1b; 3&#xff0c;弹框选择文件类型&#xff1b; 4&#xff0c;选择类型后确定上传&#xff1b; 一&#xff0c;上传 跳过&#xff1b; 二&#xff0c;定义弹框下拉框…

Coolmuster Android Assistant: 手机数据管理的全能助手

在数字化时代&#xff0c;智能手机不仅是通讯工具&#xff0c;更是个人数据的中心。随着数据量的不断增加&#xff0c;如何有效管理和保护这些数据成为了一个重要议题。Coolmuster Android Assistant应运而生&#xff0c;它是一款专为安卓用户设计的综合数据管理软件&#xff0…