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

  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. synchronized 专题

    这几天不断添加新内容,给个大概的提纲吧,方面朋友们阅读,各部分是用分割线隔开了的: synchronized与wait()/notify() JMM与synchronized ThreadLocal与 ...

  2. 将多个文本文件内的数据导入到Datagridview

    private BindingList listXSxxInfoList = new BindingList(); openFileDialog1.Multiselect = true;//允许选择多 ...

  3. Android零基础入门第54节:视图切换组件ViewSwitcher

    原文:Android零基础入门第54节:视图切换组件ViewSwitcher 前面三期学习了ProgressBar系列组件,那本期开始一起来学习ViewAnimator组件. 一.ViewAnimat ...

  4. Mysql下载(on windows-noinstall zip archive)

    所有内容,都是针对Mysql5.7.18介绍. 1.首先你需要下载一个完整的包,Mysql目前有两个版本可以使用: a. MySql Enterprise Edition:企业版 b. MySql C ...

  5. Openssl - Static libraries (w32, mingw) 以及对Qt静态编译时的设置

    Openssl static libraries created for Windows 32bit using MinGW compiler   Compiled with:       ./Con ...

  6. ring3下利用WMI监视进程创建(vc版)

    #include "stdafx.h" #define _WIN32_DCOM #include <iostream> using namespace std; #in ...

  7. 20 个免费开源的 CSS3 用户界面工具包

    ui.css Metro UI CSS Pure CSS jQuery jKit Solid HTML5/CSS3 UI Kit CSS3 UI Kit Alt CSS3 UI Kit MediaLo ...

  8. 使窗体拥有透明效果的API

    一.背景FlashGet的透明效果大家羡慕吧.传统的Windows应用程序想实现半透明效果,一般来说需要处理自己的窗口的WM_Paint消息窗口,很麻烦.现在好了,SetLayeredWindowAt ...

  9. ngnix 安装

    1安装PCRE库 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包: ...

  10. Dev C++ 工程没有调试信息 解决办法

    Dev C++ 工程没有调试信息 解决方法DevC++4.9.9.2中,按 F8 开始调试.提示信息为:工程没有调试信息,您想打开工程的调试选项并重新生成吗?选择是后,再按F8,仍旧是这个信息.什么原 ...