浅谈拓扑排序

今天来讲讲拓扑排序

度娘告诉我

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

维基百科又和我说

在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序英语:Topological sorting)。

  1. 每个顶点出现且只出现一次;
  2. 若A在序列中排在B的前面,则在图中不存在从B到A的路径。

也可以定义为:拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面[1]

想了解的自己去找,我就说这么多了。

下面步入正题。

看下面的样例。

不过要先说明一下输入格式:第一行一个整数N,之后的N行,每行若干个以0为结尾的整数。

表示第 i 个节点向这些个节点都有一条(有向)边。

那么这张图的拓扑排序就是2 4 5 3 1当然可能并不唯一。

下图是他拓扑排序后变得更加直观的图

那么这个拓扑排序是如何实现的呢。

下面我们就来看看。

首先定义一个indgr数组,表示每个点的入度(就是有几条边是指向他的)。

定义一个栈。先将所有入度为0的点入栈。然后每次都把栈顶元素输出,并且弹出记录下来,还要用一个cnt记录输出次数。输出之后,把与相连的点的入度-1,如果-1之后这个点的入度变为了0,那么就将这个点入栈,重复此操作,直到所有的点都被输出一遍,也就是说cnt==n的时候就可以结束程序了。

下面是代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>using namespace std;stack<int> S;
int n, cnt;
int son, tot[105];
int indgr[108];
int ed[105][105];int main() {scanf("%d", &n);for(int i=1; i<=n; i++) {while(scanf("%d", &son) == 1) {if(son == 0) {break;}ed[i][++tot[i]] = son;indgr[son]++;}}for(int i=1; i<=n; i++) {if(indgr[i] == 0) {S.push(i);}}while(cnt != n) {int k = S.top();printf("%d ", k);cnt++;S.pop();for(int i=1; i<=tot[k]; i++) {indgr[ed[k][i]]--;if(indgr[ed[k][i]] == 0) {S.push(ed[k][i]);}}}return 0;
}

 

作者:wlz
出处:http://www.cnblogs.com/bljfy/p/8729163.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/bljfy/p/8729163.html

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

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

相关文章

makemid+matlab,《MATLAB基础》双语课

MATLAB双语教学视频第17讲MATLAB双语教学视频第18讲Summarizing DataIn this section...“Overview” on page 5-10“Measures of Location” on page 5-10“Measures of Scale” on page 5-11“Shape of a Distribution” on page 5-11OverviewMany MATLAB functions enable y…

php获取页面的可视内容高度,网页制作技巧:获取页面可视区域的高度_css

文章简介&#xff1a;获取页面可视区域高度&#xff0c;获取页面高度&#xff0c;获取滚动条滚动上去的页面高度.function getWH(){ var wh {}; "Height Width".replace(/[^/s]/g,function(a){ var b a.toLowerCase(); wh[b]window["inner".concat(a)] d…

安装与配置-以前的某个程序安装已在安装计算机上创建挂起的文件操作......

今日在Windows XP SP2的计算机上&#xff0c;安装SQL Server 2000 Standard Edition&#xff0c;安装不上&#xff0c;错误信息如下&#xff1a; 文字描述为&#xff1a; 以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机。 解决方法…

带预览图的js切换效果!

效果图&#xff1a; js代码&#xff1a; var isIE (document.all) ? true : false;var $ function (id) {return "string" typeof id ? document.getElementById(id) : id; };var Class {create: function() {return function() { this.initialize.apply(this,…

Python成长之路【第七篇】:Python基础之装饰器

一、什么是装饰器 装饰&#xff1a;装饰既修饰&#xff0c;意指为其他函数添加新功能 器&#xff1a;器既函数 装饰器定义&#xff1a;本质就是函数&#xff0c;功能是为其他函数添加新功能 二、装饰器需要遵循的原则 1、不能修改装饰器的源代码&#xff08;开放封闭原则&#…

sql数据库与oracle数据库同步,[sql数据库同步]Oracle与SQL Server如何实现表数据同步...

在线QQ客服&#xff1a;1922638专业的SQL Server、MySQL数据库同步软件数据库的Oracle版本为10.2&#xff0c;并安装在Linux系统上。数据库SQL Server的版本是SQL 2005&#xff0c;已安装在Windows XP系统上。现在我们需要做的是在两个数据库表之间同步数据。现在&#xff0c;最…

零食嘴----美食领域的美丽说

零食嘴美食分享社区首页 阿里巴巴参谋长曾鸣曾说过&#xff1a;“淘宝等美丽说模式整整等了两年。不仅在女性领域&#xff0c;阿里希望在各个维度都出现‘美丽说’。” 零食嘴就是美食领域美丽说。 所谓的美丽说模式&#xff0c;是指社会化电子商务分享的模式&#xff0c;在一个…

测试用例设计方法

测试用例设计方法 本篇由本人整理黑盒、白盒、接口测试一系列用例设计方法。 黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法、场景图法等。 &#xff08;一&#xff09;等价类划分法 定义&#xff1a;等…

Disk Quota磁盘配额

Disk Quota &#xff1a;磁盘配额 限制某个用户或某个组&#xff0c;对某个分区(生效级别是文件系统)的使用能力&#xff1b;由于早期的Unix系统是多用户、多任务的环境&#xff0c;所以一台主机的磁盘会被多个用户使用&#xff0c;某个用户占用大量的磁盘空间会影响其他用户对…

linux进度条脚本,Linux下简易进度条的实现代码

在生活中&#xff0c;进度条是很常见的&#xff0c;那么&#xff0c;进度条是如何实现的呢&#xff1f;首先&#xff0c;进度条的动态是利用人眼视觉暂留效果的。实际上是如下过程&#xff1a;先输出&#xff1a;[ ]表示进度是1%&#xff0c;刷新之后再输出&#xff1a;[ …

[原]Jenkins(二十) jenkins再出发之Error: Opening Robot Framework log failed

错误缘由&#xff1a;使用plugin [public robot framework test results] 生成的HTML文件都无法正常打开.解决方案&#xff1a;Connect on your jenkins url (http://[IP]:8080/) Click on administer Jenkins Click on consol jenkins Copy this into the field and execut…

【016】VS2010连接内置SQL数据库

参考&#xff1a;传智播客.Net培训.net视频教程 >> 【05】第五季 ADO.NET&#xff08;1-30&#xff09; 示例代码&#xff1a;sql_test.zip 首先建立一个 控制台 或者 WinForm 项目&#xff0c;然后进行下面的操作&#xff01; 1. 在 项目 上面右键》添加》新建项 2. 接下…

为什么生产环境都是linux,关于生产环境linux系统中的wheel用户组

本文系统环境&#xff1a;CentOS Linux release 7.7.1908 (Core)一般来说&#xff0c;目前linux系统中的wheel组&#xff0c;默认情况是没有使用到的、如果要使用wheel组&#xff0c;让其有具体的作用&#xff0c;需要结合/etc/pam.d/su文件配置很多在Linux中为了更进一步加强系…

微信小程序----全局变量

全局变量的作用 在微信小程序开发中&#xff0c;会遇到一个很实际的应用场景&#xff0c;就是一个变量会在多个页面进行使用。 例如&#xff1a; 1. 在微信小程序开发中使用高德地图的微信小程序开发&#xff0c;其中key值就需要在多个页面使用&#xff1b; 2. 在微信小程序开…

linux centos-6.5,Linux(CentOS 6.5)安装 mysql

linux下安装软件的方式很多&#xff0c;这里是使用简单而方便的yum来安装一、使用yum 安装mysql服务&#xff0c;客户端1、检查是否已经安装&#xff1a; yum list installed | grep mysql2、 yum list installed | grep MYSQL3、查询结果&#xff1a;4、这是我已经安装的mysq…

amcharts应用

查看选中的软件的下载量&#xff0c;通过amchart报表工具显示出软件日下载量&#xff0c;月下载量以及年下载量&#xff0c;下面简单介绍&#xff0c;amchart在struts2中的应用。 amCharts提供JavaScript/HTML5图表。一套包括串行&#xff08;列&#xff0c;栏&#xff0c;线&a…

linux下makefile中cp,make与makefile 的理解

当我们写程序过程中存在多个文件之间有复杂的包含关系时&#xff0c;若修改了其中一个源文件&#xff0c;就重新编译所有文件&#xff0c;一般是不必要的&#xff0c;并且当文件很多时&#xff0c;就显得非常笨拙。所有包含该文件的文件需要重新编译&#xff0c;而其它无关系的…

keil用c语言怎么编辑器,用keil软件编写单片机程序的步骤

猜你感兴趣&#xff1a;新手教程&#xff1a;单片机的学习实践步骤运用单片机便是了解单片机硬件结构&#xff0c;以及内部资源的运用&#xff0c;在汇编或C语言中学会各种功用的初始化设置&#xff0c;以及完成各种功用的程序编制。 运用按钮输入信号&#xff0c;发光二极管显…

体重 年龄 性别 身高 预测鞋码_【新手扫盲】身高体重性别年龄身体素质影响玩滑板吗?...

很多新手在迈入滑板大门之前都会有诸多顾虑&#xff0c;以为滑板跟其他运动一样&#xff0c;门槛很高我想说&#xff0c;滑板是项自由友好的运动下到3岁小宝宝&#xff0c;上到60岁以上老人只要你想玩&#xff0c;那就可以参与进来没有任何因素能阻止你玩滑板1、你比他高吗&…

html5点击按钮出现弹窗 怎么实现_HTML5游戏开发过程中的二三事

文/ Luiu最近跟的一款项目是HTML5手游&#xff0c;在这个项目中遇到并解决了诸多问题&#xff0c;也学习到了很多项目开发过程中需要注意的事情。这个项目自立项到现在已经过了5个多月&#xff0c;如今项目研发已经过了早期的忙乱阶段&#xff0c;于是借此机会梳理下思绪&#…