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

搜索与图论——拓扑排序

有向图的拓扑排序就是图的宽度优先遍历的一个应用

有向无环图一定存在拓扑序列(有向无环图又被称为拓扑图),有向有环图一定不存在拓扑序列。无向图没有拓扑序列。

拓扑序列:将一个图排成拓扑序后,所有的边都是从前指向后的。

入度:有多少条边指向自己

出度:有多少条边指向别人

入度为0的点都可以排在最前边

#include<iostream>
#include<cstring>using namespace std;const int N = 100010;int n, m;
int h[N], e[N], ne[N], idx;
int q[N];
int d[N]; //入度void add(int a, int b)
{e[idx] = b, ne[idx] = h[a]; h[a] = idx ++ ;
}bool toposort()
{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]; //枚举t的所有出边jd[j] -- ; /删掉t -> j边,j的入度--if(d[j] == 0) q[ ++ tt] = j; //如果j的入度==0,推入队列}}return tt == n - 1; //如果队尾 == n - 1说明所有点都进过队列了,说明该图是一个有向无环图
}int main()
{cin >> n >> m;memset(h, -1, sizeof h);while(m -- ){int a, b;cin >> a >> b;add(a, b);d[b] ++ ;}if(toposort()){for(int i = 0; i < n; i ++ ) cout << q[i] << " ";}else cout << -1 << endl;return 0;
}

http://www.lryc.cn/news/333595.html

相关文章:

  • linux CentOS7配置docker的yum源并安装
  • vue结合Elempent-Plus/UI穿梭框更改宽度以及悬浮文本显示
  • 汇川PLC学习Day4:电机参数和气缸控制参数
  • 数据可视化高级技术Echarts(快速上手柱状图进阶操作)
  • 【数据结构与算法】力扣 206. 反转链表
  • 【随笔】Git 高级篇 -- 本地栈式提交 rebase | cherry-pick(十七)
  • 数据结构-- 基于顺序表的通讯录代码讲解
  • qt-C++笔记之QLabel加载图片
  • Unity中UI系统1——GUI
  • GIt 删除某个特定commit
  • Django --静态文件
  • 蓝桥杯第十三届省赛C++B组(未完)
  • 编程生活day7--明明的随机数、6翻了、吃火锅
  • css酷炫边框
  • 使用 Docker 部署 Photopea 在线 PS 工具
  • 回溯法(一)——全排列 全组合 子集问题
  • 【Pt】马灯贴图绘制过程 04-玻璃脏迹
  • Rust 程序设计语言学习——枚举模式匹配
  • 正则表达式(1)
  • nginx + keepalived 搭建教程
  • React事件和原生事件的执行顺序
  • 为什么在计算查询Q和键K的矩阵乘法时需要转置键矩阵K。示例说明q11,k11代表什么。线性变换矩阵 W_q 用于生成查询,W_k 用于生成键怎么获取的。
  • 剑指Offer题目笔记27(动态规划单序列问题)
  • 撸代码时,有哪些习惯一定要坚持?
  • 【leetcode面试经典150题】17.罗马数字转整数(C++)
  • 前后端开发之——文章分类管理
  • 第12届蓝桥杯省赛 ---- C/C++ C组
  • IVS模型解释
  • 通用开发技能系列:Git
  • 最新怎么订阅OnlyFans上喜欢的博主,详细教程