拓扑排序算法主要由以下两步循环执行,直到不存在入度为 的顶点为止。

  1. 选择一个入度为 的顶点并将它输出;
  2. 删除从该顶点连出的所有边。
    循环结束,若输出的顶点数小于图中的顶点数,则表示该图中存在回路,也就是无法进行拓扑排序;否
    则输出的顶点序列就是一个拓扑序列。
    接下来,我们用一个例子来说明这个算法过程。对于如下的图,我们首先统计所有顶点的入度,并找出
    其中所有入度为零的顶点,发现只有 ,于是我们将 插入队列中。
    图中圆圈内的数字表示顶点的入度,圆圈下方的数字表示顶点编号,直线表示边,直线一端的箭头表示
    边的方向。图的下方是一个队列,用来在拓扑排序时储存所有未处理的入度为零的顶点。

基于邻接表的 C++ 示例代码如下:


基础代码

现在代码中已经给出了用来存储图的邻接表的声明和相关函数的实现。
接下来我们需要声明顶点数量 n 和边的数量 m 以及统计每个点入度的数组 indegree 。
在 main 函数上面写下

int n, m;
int indegree[MAX_N];

初始化操作以及输入 n和 m的值。
初始时所有点入度都是 0。
在 main 函数里面写下

init();
memset(indegree, 0, sizeof(indegree));
cin >> n >> m;

接下来输入 m 条边插入邻接表并增加该边终点的入度数量。
在 main 函数里面继续写下

for (int i = 0; i < m; i++)
{
int u, v;
cin >> u >> v;
insert(u, v);
indegree[v]++;
}

接下来实现 topo 函数,实现拓扑排序。拓扑排序的步骤如下:
1、首先我们找到图中入度为0 的点,将其入队。
我们在 main 函数前写下

void topo()
{
queue<int> q;
for (int i = 1; i <= n; i++)
{
if (indegree[i] == 0)
{
q.push(i);
}
}
}

拓扑排序的步骤:
2、每一次选取队首的点,将其输出并出队,随后删除所有以该点为起点的边,如果删边之后出现入度为的0点,则将这个点入队。
3、重复第二步直到队列为空。
我们先完成第2步的选取队首的点,输出并出队。
在 topo 函数里继续写下

while (!q.empty())
{
int now = q.front();
cout << now << endl;
q.pop();
}

拓扑排序的步骤:
2、每一次选取队首的点,将其输出并出队,随后删除所有以该点为起点的边,如果删边之后出现入度为0的点,则将这个点入队。
3、重复第二步直到队列为空。
接下来我们来完成第2 步的删边操作,边可以不用真删,只是改变该边终点的入度就可以了。
在 topo 函数里的 while 循环中继续写下

for (int i = p[now]; i != -1; i = E[i].next)
{
int v = E[i].v;
indegree[v]--;
}

拓扑排序的步骤:
2、每一次选取队首的点,将其输出并出队,随后删除所有以该点为起点的边,如果删边之后出现入度为0的点,则将这个点入队。
3、重复第二步直到队列为空。
接下来我们来完成第2步的入队操作,如果删边后出现了入度为0的点,我们需要把它加入队列。
在 topo 函数里的 while 循环中的 for 循环内继续写下

if (indegree[v] == 0)
{
q.push(v);
}

我们已经完成了 topo 函数,那么就可以在 main 函数里调用 topo 函数进行拓扑排序了。
在 main 函数里面写下

topo();

终于完成了,点击运行,输入下面的数据看看效果吧。

4 3
1 2
3 2
2 4

聪明的你一定学会了实现拓扑排序了

例题传送门:
排队
威虎山上的分配
ov.

【不带权图算法之拓扑排序】-C++的更多相关文章

  1. [BZOJ1565][NOI2009]植物大战僵尸-[网络流-最小割+最大点权闭合子图+拓扑排序]

    Description 传送门 Solution em本题知识点是用网络流求最大点权闭合子图. 闭合图定义:图中任何一个点u,若有边u->v,则v必定也在图中. 建图:运用最小割思想,将S向点权 ...

  2. 【noip模拟赛4】找啊找啊找BF 拓扑排序

    描述 sqybi上次找GF的工作十分不成功,于是依旧单身的他在光棍节前的某天突发奇想,要给自己找一个BF(这里指的是男性的好朋友……),这样既可以和人分享内心的压抑(路人甲:压抑还分享么……),也可以 ...

  3. CodeForces - 645D Robot Rapping Results Report(拓扑排序)

    While Farmer John rebuilds his farm in an unfamiliar portion of Bovinia, Bessie is out trying some a ...

  4. BZOJ3832[Poi2014]Rally——权值线段树+拓扑排序

    题目描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long di ...

  5. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

  6. 拓扑排序&关键路径

    拓扑排序:AOV网 概念 example:选课问题:AOV网 顶点活动(Activity On Vertex)网是指用顶点表示活动,而用边集表示活动关系的有向图. 在这个例子中,课程为结点,而有向边表 ...

  7. 洛谷P1073 Tarjan + 拓扑排序 // 构造分层图

    https://www.luogu.org/problemnew/show/P1073 C国有 n n个大城市和 mm 条道路,每条道路连接这 nn个城市中的某两个城市.任意两个城市之间最多只有一条道 ...

  8. 算法:图(Graph)的遍历、最小生成树和拓扑排序

    背景 不同的数据结构有不同的用途,像:数组.链表.队列.栈多数是用来做为基本的工具使用,二叉树多用来作为已排序元素列表的存储,B 树用在存储中,本文介绍的 Graph 多数是为了解决现实问题(说到底, ...

  9. 【bzoj1093】[ZJOI2007]最大半连通子图 Tarjan+拓扑排序+dp

    题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:对于u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径. ...

随机推荐

  1. 微信小程序把玩(二十六)navigator组件

    原文:微信小程序把玩(二十六)navigator组件 navigator跳转分为两个状态一种是关闭当前页面一种是不关闭当前页面.用redirect属性指定. 主要属性: wxml <naviga ...

  2. 8086 CPU 寄存器简介(超详细,图文并茂)

    http://www.cnblogs.com/BoyXiao/archive/2010/11/20/1882716.html

  3. C# WebRequest POST上传数据

    WebRequest request = WebRequest.Create("http://www.cnsos.net"); // Set the Method property ...

  4. Linux iostat

    转自 http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858810.html Linux IO实时监控iostat命令详解 简介 iostat ...

  5. Windows Vista 的历史地位

    Windows Vista,这是一个不那么如雷贯耳的Windows名字,很多人甚至从来没有体验过这个操作系统.但是,Windows Vista刚刚推出时候所引起的话题性,恐怕是其后的Win7也难以与之 ...

  6. PHP开发框架 Laravel

    Laravel 是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富 ...

  7. linux环境下使用百度云网盘

    linux下经常需要备份一些文件到云端,现在能用的也就只有度娘的百度云网盘了,在github上发现一个挺好的项目,bypy,用来在linux下使用百度云. 项目地址:https://github.co ...

  8. win7、win8客户端 连接win2003上的sqlserver2005 速度超慢

    解决办法:开始运行,执行netsh interface tcp set global rss=disabled autotuninglevel=disabled.关闭TCP/IP协议的自动调谐功能.

  9. Cleanmymac X 4.4.3 激活破解版|兼容mac最新系统-Mac电脑清理工具

    CleanMyMac X 4.4.3 激活破解版为最新版清理工具,为你所爱的东西腾出空间.CleanMyMac拥有一系列巧妙的新功能,它可以安全.智能地扫描和清理整个系统,删除大的未使用的文件,卸载不 ...

  10. 用java打印日历

    来自<java核心技术卷一> /** * Created by wangbin10 on 2019/1/3. * 打印当月日历 */ public class CalendarTest { ...