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

AcWing848有向图的拓扑排序

拓扑排序的流程:

  1. 插入(a,b),表示a->b的关系,调用add(a,b),每次吧b的入度+1,d[b]++;
    然后调用topsort,返回1表示存在拓扑序列,返回0表示不存在拓扑序列。
  2. 判断是否存在拓扑排序的逻辑:
    先把所有入度为0的点入队,这些都是可能的结果。
    取出队头t,然后出队
    因为是拉链法表示的有向图,因此访问t对应的所有出边j=e【i】
    然后删除t->j的关系,把j的入度-1,d[j] --,如果-1之后发现j的入度为0,那么j依然可能是新的拓扑序列的一员,需要把j入队!
  3. 如果拓扑排序完了之后,把所有的点都曾入队过,那么存在拓扑序列。
#include<iostream>
#include<algorithm>
#include<cstring>
#define N 100086
using namespace std;
int n,m;
int h[N],e[N],ne[N],idx;
int d[N],q[N];
void add(int a,int b){e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool topsort(){int hh=0,tt=-1;for(int i=1;i<=n;++i)if(!d[i])q[++tt]=i;while(hh<=tt){int t=q[hh++];for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(--d[j]==0){q[++tt]=j;}}}return tt==n-1;
}
int main(){cin>>n>>m;memset(h,-1,sizeof h);for(int i=0;i<m;++i){int a,b;cin>>a>>b;add(a,b);d[b]++;}if(!topsort())puts("-1");else{for(int i=0;i<n;i++)cout<<q[i]<<' ';puts("");}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ModuleNotFoundError: No module named ‘sentence_transformers.model_card‘
  • 蓝牙音视频远程控制协议(AVRCP) command跟response介绍
  • filezilla软件介绍
  • 【API网关】 使用Kong、Zuul等工具实现API网关
  • 【Python系列】执行 Shell 命令的六种方法
  • Android UI:PopupWindow:源码分析:设置WindowManager.LayoutParams中的各种参数
  • 《Redis核心技术与实战》学习笔记5——内存快照RDB:宕机后,Redis如何实现快速恢复?
  • 掌握责任链模式:提升系统灵活性与扩展性的秘诀!
  • 如何在Linux系统上使用ONLYOFFICE文档编辑PDF文件
  • and design vue表格列宽度拖拽,vue-draggable-resizable插件使用
  • 软件工程(4)面向对象方法:面向对象软件工程OOSE与案例实践
  • 编程艺术的细枝末节:深入探索调用约定
  • 仿twitter社区源码推特PHP源码
  • xss靶场详解
  • Redis的数据结构——Hash表
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • bootstrap创建登录注册页面
  • Bytom交易说明(账户管理模式)
  • CEF与代理
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Just for fun——迅速写完快速排序
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • NSTimer学习笔记
  • Octave 入门
  • Tornado学习笔记(1)
  • ViewService——一种保证客户端与服务端同步的方法
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 聊聊flink的BlobWriter
  • 前端面试之闭包
  • 使用Swoole加速Laravel(正式环境中)
  • 微信小程序设置上一页数据
  • 异常机制详解
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 中文输入法与React文本输入框的问题与解决方案
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 湖北分布式智能数据采集方法有哪些?
  • "无招胜有招"nbsp;史上最全的互…
  • # Java NIO(一)FileChannel
  • #565. 查找之大编号
  • #Linux(权限管理)
  • (13)DroneCAN 适配器节点(一)
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (C语言)fgets与fputs函数详解
  • (python)数据结构---字典
  • (十一)c52学习之旅-动态数码管
  • (一)SpringBoot3---尚硅谷总结
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)程序员技术练级攻略
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • *2 echo、printf、mkdir命令的应用
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表