2014.07.04 17:23

简介:

  我们考虑一种特殊的图:

    1. 有向图

    2. 只有一个连通分量

    3. 不存在环

  那么这样的图里,必然可以找到一种排序方式,来确定谁在谁的“前面”。

  简单的来说可以这么理解:如果存在一条边a->b,那么a顶点就在b的前面。

  下面我们通过例子来看看拓扑排序的过程,确定所有的顶点中,谁排在谁的前面。

图示:

  下面是一个图,符合上面所提出的三个条件,因此可以进行拓扑排序。我们关注每个顶点的入度,表示这个顶点被指向的次数

  

  每次我们都选出一个入度为0的顶点,因为入度为0的顶点是没有被任何边指向的。“被指向”就代表排在后面。

  比如从目前的图看来,C->E代表顶点E排在顶点C之后。

  

  把入度为0的顶点去除后,同时去除包含它们的边。入度为0的顶点可能不止一个,所以这些点的排序也是并列的。

  

  继续去掉入度为0的顶点并且把它们的排序记录下来,同时去掉对应的边。直至所有顶点都去掉为止。

  

  

  当所有顶点都去掉了,排序也就完成了。

  实际上,即使图的连通分量不止一个排序也可以进行,只是不同连通分量之间的排序是互不影响的。只要是无环有向图,都可以进行拓扑排序。

实现:

 // A simple illustration for topological sort. Graph represented by adjacency matrix.
#include <iostream>
#include <queue>
#include <vector>
using namespace std; void topologicalSort(const vector<vector<bool> > &graph, vector<int> &order)
{
int n;
int i, j;
vector<int> indegree;
queue<int> q; n = (int)graph.size();
indegree.resize(n, ); for (i = ; i < n; ++i) {
for (j = ; j < n; ++j) {
if (graph[i][j]) {
++indegree[j];
}
}
} for (i = ; i < n; ++i) {
if (indegree[i] == ) {
q.push(i);
break;
}
} while (!q.empty()) {
i = q.front();
q.pop();
order.push_back(i);
for (j = ; j < n; ++j) {
if (graph[i][j] && (--indegree[j] == )) {
q.push(j);
}
}
} indegree.clear();
} int main()
{
vector<vector<bool> > graph;
vector<int> order;
int n;
int nk;
int i, j;
int tmp; while (cin >> n && n > ) {
graph.resize(n);
for (i = ; i < n; ++i) {
graph[i].resize(n, false);
} for (i = ; i < n; ++i) {
cin >> nk;
for (j = ; j < nk; ++j) {
cin >> tmp;
graph[i][tmp] = true;
}
} topologicalSort(graph, order); if ((int)order.size() == n) {
for (i = ; i < n; ++i) {
cout << order[i] << ' ';
}
cout << endl;
} else {
cout << "The graph has a cycle." << endl;
} for (i = ; i < n; ++i) {
graph[i].clear();
}
graph.clear();
order.clear();
} return ;
}

《数据结构与算法分析:C语言描述》复习——第九章“图论”——拓扑排序的更多相关文章

  1. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  2. 【数据结构与算法分析——C语言描述】第二章总结 算法分析

    算法 算法(algorithm)是为求解一个问题需要遵循的.被清楚地指定的简单指令的集合. 数学基础 四个定义: 1.大O表示法: 如果存在正常数 c 和 n0 使得当 N ≥ n0时,T(N) ≤ ...

  3. 【数据结构与算法分析——C语言描述】第一章总结 引论

    这一章主要复习了一些数学知识,像指数.对数.模运算.级数公式:还有2种证明方法,归纳假设法和反证法.所幸以前学过,重新拾捡起来也比较轻松. 简要地复习了递归,提出了编写递归例程的四条基本法则: 基准情 ...

  4. 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)

    #include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...

  5. C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载

    维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...

  6. 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)

    开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...

  7. 《数据结构与算法分析-Java语言描述》 分享下载

    书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...

  8. 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

    表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...

  9. 读书笔记:《数据结构与算法分析Java语言描述》

    目录 第 3 章 表.栈和队列 3.2 表 ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 3.3 Java Collections API 中的表 3.3.1 Collection 接口 ...

随机推荐

  1. Vue.js-创建Vue项目(Vue项目初始化)并不是用Webstrom创建,只是用Webstrom打开

    我犯的错误:作为vue小白,并不知道还要单独去创建初始的vue项目,于是自己在webstrom中建了一个Empty Project, 在其中新增了一个js文件,就开始import Vue from “ ...

  2. Node.js-Webstorm2018配置nodejs

    网上都是webstorm老版本的设置方法!根本就找不到以下配置项: 下面介绍2018版的配置方式.功能:使webstrom支持node.js语法检测及语法提示! 例如:配置前,没有任何提示 配置后 配 ...

  3. OpenGL纹理高级

    矩形纹理 对于二维纹理来说,除了GL_TEXTURE_2D之外,使用GL_TEXTURE_RECTANGLE就可以使用矩形纹理. 矩形纹理几大特点: 不能Mip,只能加载glTexImage2D的le ...

  4. 2295: KMP模式匹配 一(串)

    2295: KMP模式匹配 一(串) 时间限制: 1 Sec  内存限制: 128 MB提交: 210  解决: 97[提交][状态][讨论版][命题人:外部导入] 题目描述 求子串的next值,用n ...

  5. python_3_coding

    # -*- coding:utf-8 -*- 也可以换成下划线 用于声明文件编码,python3本身就是utf-8类型,不用声明 name="你好,世界"#utf-8格式能显示汉字 ...

  6. Spring Java配置

    Java配置 Java配置是Spring 4.x推荐的配置方式,可以完全替代xml配置:Java配置也是Sping Boot 推荐的配置方式.Java配置是通过@Configuration和@Bean ...

  7. test image

    Most of these images are in PBM or PGM format and compressed with GNU Zip and GNU TAR Note: These pa ...

  8. P2082 区间覆盖(加强版)

    题目 #include<iostream> #include<algorithm> #include<cstring> using namespace std; s ...

  9. [USACO07FEB]银牛派对Silver Cow Party---最短路模板题

    银牛排队 对于我这种蒟蒻来说,还是不要跑一次单元最短路.跑两次好写呀(- ̄▽ ̄)- 而题目中是有向图.如果如果按照题意进行最短路的话.就会出现一个单终点最短路和一个单起点最短路 对于单起点自然就是套模 ...

  10. C#使用ref和out传递数组

    C#使用ref和out传递数组 一.使用ref参数传递数组 数组类型的ref参数必须由调用方明确赋值.因此,接受方不需要明确赋值.接受方数组类型的ref参数能够修改调用方数组类型的结果.可以将接受方的 ...