拓扑排序

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

AOV网

  在有些工程中,很多子工程(活动)必须在其它有关子工程完成之后才能开始,也就是说,一个子工程的开始是以它的所有前序子工程的结束为先决条件的,我们把这种顶点表示活动、边表示活动间先后关系的有向图称做顶点活动网(Activity On Vertex network),简称AOV网。

  由AOV网构造出拓扑序列的实际意义是:如果按照拓扑序列中的顶点次序,在开始每一项活动时,能够保证它的所有前驱活动都已完成,从而使整个工程顺序进行,不会出现冲突的情况。

求拓扑序通常使用两种方法:(以下代码可通过UVa 10305)

DFS 求拓扑序

#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; int n, m, x, y;
int q[200], t; bool e[200][200]; short v[300]; bool dfs(int u)
{
v[u] = -1;
for (int i = 1; i <= n; ++i)
if (e[u][i]) if (!v[i] < 0) return false;
else if (!v[i] && !dfs(i)) return false;
v[u] = 1;
q[--t] = u;
return true;
} bool top_sort(void)
{
t = n + 1;
memset(v, 0, sizeof(v));
for (int i = 1; i <= n; ++i)
if (!v[i]) if (!dfs(i)) return false;
return true;
} int main()
{
while (cin >> n >> m && n)
{
memset(e, false, sizeof(e));
memset(ind, 0, sizeof(ind));
for (int i = 1; i <= m; ++i)
{
scanf("%d%d", &x, &y);
e[x][y] = true;
}
if (top_sort())
for (int i = 1; i <= n; ++i)
printf("%d ", q[i]);
else printf("-1");
printf("\n");
}
}

BFS 求拓扑序

#include <iostream>
#include <cstdio>
#include <cstring> using namespace std; int n, m, x, y;
int q[200];
int ind[200]; bool e[200][200]; void top_sort(void)
{
int h = 1, t = 0;
for (int i = 1; i <= n; ++i)
if (ind[i] == 0)
q[++t] = i;
while (h <= t)
{
int u = q[h++];
for (int i = 1; i <= n; ++i)
if (e[u][i])
{
--ind[i];
if (ind[i] == 0)
q[++t] = i;
}
}
for (int i = 1; i <= n; ++i)
printf("%d ", q[i]);
printf("\n");
} int main()
{
while (cin >> n >> m && n)
{
memset(e, false, sizeof(e));
memset(ind, 0, sizeof(ind));
for (int i = 1; i <= m; ++i)
{
scanf("%d%d", &x, &y);
e[x][y] = true;
++ind[y];
}
top_sort();
}
}

拓扑排序 topsort的更多相关文章

  1. HDU.3342 Legal or Not (拓扑排序 TopSort)

    HDU.3342 Legal or Not (拓扑排序 TopSort) 题意分析 裸的拓扑排序 根据是否成环来判断是否合法 详解请移步 算法学习 拓扑排序(TopSort) 代码总览 #includ ...

  2. HDU.2647 Reward(拓扑排序 TopSort)

    HDU.2647 Reward(拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 这道题有一点变化是要求计算最后的金钱数.最少金钱值是888,最少的 ...

  3. HDU.1285 确定比赛名次 (拓扑排序 TopSort)

    HDU.1285 确定比赛名次 (拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 只不过这道的额外要求是,输出字典序最小的那组解.那么解决方案就是 ...

  4. 拓扑排序 topsort详解

    1.定义 对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列. 举例: h3 { marg ...

  5. 【拓扑排序topsort】【p1226】神经网络

    描述 Description 神经网络就是一张有向图,图中的节点称为神经元,而且两个神经元之间至多有一条边相连,下图是一个神经元的例子: 神经元[编号为1) 图中,X1—X3是信息输入渠道,Y1-Y2 ...

  6. 拓扑排序(topsort)

    本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 和离散数学中偏序/全序概念的联系 典型实现算法解的唯一性问题 Kahn算法 基于DFS的算法 实际例子 取材自以下材料: http://e ...

  7. 算法学习 拓扑排序(TopSort)

    拓扑排序 一.基本概念 在一个有向无环图(Directed Acyclic Graph, DAG)中,规定< u,v > 表示一条由u指向v的的有向边.要求对所有的节点排序,使得每一条有向 ...

  8. poj 3687(拓扑排序)

    http://poj.org/problem?id=3687 题意:有一些球他们都有各自的重量,而且每个球的重量都不相同,现在,要给这些球贴标签.如果这些球没有限定条件说是哪个比哪个轻的话,那么默认的 ...

  9. 拓扑排序(三)之 Java详解

    前面分别介绍了拓扑排序的C和C++实现,本文通过Java实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处 ...

随机推荐

  1. C 语言实例 - 判断字母

    C 语言实例 - 判断字母 C 语言实例 C 语言实例 用户输入一个字符,判断该字符是否为一个字母. 实例 #include <stdio.h> int main() { char c; ...

  2. Maven - StackOverflowError

    问题与分析 今天发现服务器上的Jenkins在集成项目时报错,报错原因如下: error compiling: java.lang.StackOverflowError -> [Help 1] ...

  3. Centos 7 install cacti监控

    首先,先安装LNMP服务 安装一: 如果觉得安装起来麻烦,可以到如下网站进行安装: https://lnmp.org/install.html 安装二: 采用yum或者安装包的方式进行安装,具体操作请 ...

  4. code blocks无法输出中文解决方法

    是CodeBlocks编译器设置问题,在CodeBlocks菜单 settings -> compiler and debugger settings -> global compiler ...

  5. aix OPATH ISSUE

    issue 1: OPatch cannot find a valid oraInst.loc file to locate Central Inventory (OPatch failed with ...

  6. jquery自定义组件开发

    jquery的组件已经有很多,但是有可能找不到符合我们需求的组件,所以我们可以动手自己封装一个jquery组件. 第一步要知道封装jquery组件的基本语法 (function ($) { $.fn. ...

  7. 故障案例:主从同步报错Fatal error: The slave I/O thread stops because master and slave have equal MySQL server

    https://blog.csdn.net/cug_jiang126com/article/details/46846031

  8. MongoDB 最初级步骤

    对库TEST下的LOG聚集集合中的inserttim字段加索引 步骤(注意:前四步步骤不能错,错了不行): 一,打开F:\mongodb\bin\mongo.exe,也可以用cmd命令指到这个exe执 ...

  9. WPF (VisualChildren)可视化子元素详解

    VisualChildrenCount    的 FrameworkElement 实现始终返回 0 或 1.  如果类所要维护的可视化子元素集合的成员数可能超过 1,则这样的类必须重写此属性和 Ge ...

  10. 【.Net MVC4 connectionString设置】获取SQL server数据库的连接字符串

    第一步:创建向导文件 在桌面创建一个txt文件,并将文件后缀改成“.udl”.    第二步:选择“提供程序”tab页 双击新创建的“.udl”文件,进入后选择“提供程序”tab页,选择“Micros ...