拓扑排序

  对一个有向无环图(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. maven - 初识

    一.Maven是什么? Maven官网的描述:Apache Maven is a software project management and comprehension tool. Based o ...

  2. 利用sizeof,得到二维数组的维度

    #include <iostream> #include <stdlib.h> using namespace std; int main() { ][]; cout < ...

  3. STP-9-处理RSTP中的拓扑变化

    STP能识别四种不同的拓扑变化事件, 而RSTP只有当非边界端口从非转发状态变为转发状态才认为发生了拓扑变化事件 因为刚变为转发状态的端口可以为一些mac地址提供比之前更好的路径,CAM表需要更新.失 ...

  4. js 阻止元素发生默认的行为ie兼容

    //亲测ie9可以兼容 function Go(event) { var e = event; if (e && e.preventDefault) { e.preventDefaul ...

  5. 用Open Live Writer写博体验

    感觉还蛮方便的--openlivewriter第一博!

  6. NET Core中使用Redis和Memcached

    .NET Core中使用Redis和Memcached的序列化问题   前言 在使用分布式缓存的时候,都不可避免的要做这样一步操作,将数据序列化后再存储到缓存中去. 序列化这一操作,或许是显式的,或许 ...

  7. C#使用GZipStream实现压缩和解压缩

    前言 我们在项目中,有可能会遇到存入到数据库或者传输的数据量比较大,这个时候,就可以考虑在存入数据库或者发送传输之前,将数据压缩下,当从数据库中取出时,再解压还原数据. 正文 废话不多说,我封装了一个 ...

  8. Hi,bro

    这是我第一次写部落格,也是我刚开始学python,希望我以后能把To Do List 做好,也希望大家可以好好学习,为了以后good life去努力,Do SomeThing OK?

  9. feign实现服务间的负载均衡

    feign Feign是一个声明式的Web Service客户端,它使得编写Web Serivce客户端变得更加简单.我们只需要使用Feign来创建一个接口并用注解来配置它既可完成.它具备可插拔的注解 ...

  10. 兼容IE9以下的获取兄弟节点

    function fileCheck(ele){ function getNextElement(node){ //兼容IE9以下的 获取兄弟节点 var NextElementNode = node ...