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

拓扑排序算法

拓扑排序算法

  • 什么是拓扑排序
  • 拓扑排序算法的作用
  • 卡恩算法
  • DFS算法
  • 参考代码

什么是拓扑排序

给定一个有向无环图,排出一个含所有顶点的序列AAA满足:
对于图中的每条边(u,v)(u,v)(u,v),必须满足uuuAAA中出现都在vvv的前面,则称序列AAA是该图的一定拓扑序。

拓扑排序算法的作用

  • 生成拓扑序列
  • 可以判断有向图中是否存在环

卡恩算法

通过计算顶点的度数来实现,对于一条边(u,v)(u,v)(u,v),在读取的时候计算顶点vvv的入度加1,完成所有的边的读入后,创建一个队列,将入度度数为0的顶点拉进队列,之后遍历这个顶点相邻的其他顶点,将这些边全部删除,也就是让相邻顶点的入度度数减1,当有顶点的入度度数为0的时候,将这个新顶点拉近队列,重复如此。

DFS算法

这个算法的核心思想是变色,给每个顶点三种颜色来区分,0就是没有遍历到,-1就正在遍历,1就是已经遍历完了的,每个顶点都会经历0−>−1−>10->-1->10>1>1三个状态,如果发现遍历过程时出现了-1,说明遇到了环,此时返回FalseFalseFalse,退出程序。

参考代码

#include<bits/stdc++.h>
using namespace std;
using ll =long long ;const int N=1e6+10;vector<int>e[N],tp;
int n,m;
int d[N];//记录度数
int c[N];//染色标记
bool topsort(){queue<int>q;for(int i=1;i<=n;i++){if(d[i]==0)q.push(i);}while(!q.empty()){int t=q.front();q.pop();for(int v:e[t]){if(--d[v]==0)q.push(v);}tp.push_back(t);}return tp.size()==n;
}
bool dfs(int x){c[x]=-1;for(int y:e[x]){if(c[y]<0)return 0;else if(c[y]==0){if(!dfs(y))return 0;}}c[x]=1;tp.push_back(x);return 1;
}
int main(){cin>>n>>m;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;d[v]++;}
}
http://www.dtcms.com/a/303493.html

相关文章:

  • LeetCode 85. 最大矩形
  • Nginx 四层(stream)反向代理 + DNS 负载均衡
  • 回滚日志-undo log
  • Resilience4j 实战—使用方式及配置详解
  • 如何利用机器学习分析筛选生物标记物
  • 【机器学习】第八章 模型评估及改进
  • C++入门自学Day2-- c++类与对象(初识)
  • Redis做混沌测试都需要测哪些场景?预期如何?
  • Java项目:基于SSM框架实现的进销存管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
  • # Android 15 修改系统源码指定安装源
  • yolo 目标检测600类目标
  • 免费版酒店收银系统弹窗在押金原路退回流程中的应用价值探究 ——仙盟创梦IDE
  • React Router v6 核心组件
  • 关闭 UniGetUI 自动 Pip 更新,有效避免 Anaconda 环境冲突教程
  • 基于Vue3.0+Express的前后端分离的任务清单管理系统
  • Leaflet 综合案例-矢量图层控制
  • 二分查找的「左右为难」:如何优雅地找到数组中元素的首尾位置
  • SQL笔试面试
  • 深入理解 Qt 信号与槽机制的底层逻辑
  • AUTOSAR Mcal SPI - EB工具配置介绍
  • Android Handler 完全指南
  • 手游遇攻击为何要用游戏盾SDK?
  • Linux学习--C语言(指针3)
  • 第三阶段—8天Python从入门到精通【itheima】-139节(pysqark实战-前言介绍)
  • linux du、df命令使用教程
  • AWS Bedrock Claude 3 API的完整指南
  • 基于STM32设计的智慧果园云监测系统_256
  • 从像素到频率:OpenCV傅里叶变换
  • 扑克洗牌
  • NVMe高速传输之摆脱XDMA设计18:PRP控制模块设计