拓扑排序 topsort
拓扑排序
对一个有向无环图(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的更多相关文章
- HDU.3342 Legal or Not (拓扑排序 TopSort)
HDU.3342 Legal or Not (拓扑排序 TopSort) 题意分析 裸的拓扑排序 根据是否成环来判断是否合法 详解请移步 算法学习 拓扑排序(TopSort) 代码总览 #includ ...
- HDU.2647 Reward(拓扑排序 TopSort)
HDU.2647 Reward(拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 这道题有一点变化是要求计算最后的金钱数.最少金钱值是888,最少的 ...
- HDU.1285 确定比赛名次 (拓扑排序 TopSort)
HDU.1285 确定比赛名次 (拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 只不过这道的额外要求是,输出字典序最小的那组解.那么解决方案就是 ...
- 拓扑排序 topsort详解
1.定义 对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列. 举例: h3 { marg ...
- 【拓扑排序topsort】【p1226】神经网络
描述 Description 神经网络就是一张有向图,图中的节点称为神经元,而且两个神经元之间至多有一条边相连,下图是一个神经元的例子: 神经元[编号为1) 图中,X1—X3是信息输入渠道,Y1-Y2 ...
- 拓扑排序(topsort)
本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 和离散数学中偏序/全序概念的联系 典型实现算法解的唯一性问题 Kahn算法 基于DFS的算法 实际例子 取材自以下材料: http://e ...
- 算法学习 拓扑排序(TopSort)
拓扑排序 一.基本概念 在一个有向无环图(Directed Acyclic Graph, DAG)中,规定< u,v > 表示一条由u指向v的的有向边.要求对所有的节点排序,使得每一条有向 ...
- poj 3687(拓扑排序)
http://poj.org/problem?id=3687 题意:有一些球他们都有各自的重量,而且每个球的重量都不相同,现在,要给这些球贴标签.如果这些球没有限定条件说是哪个比哪个轻的话,那么默认的 ...
- 拓扑排序(三)之 Java详解
前面分别介绍了拓扑排序的C和C++实现,本文通过Java实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处 ...
随机推荐
- 8.Python初窥门径(文件操作)
Python (文件操作) 一.文件操作方式 打开文件 open 操作文件 read or write 关闭文件 close 二.打开文件的方式(第一种) 语法 : f=open("文件&q ...
- HBase中报错 java.lang.NoClassDefFoundError: com/google/protobuf/LiteralByteString
Protobuf(全称 Protocol Buffers)是 Google 开发的一种数据描述语言,能够将结构化数据序列化,可用于数据存储.通信协议等方面.在 HBase 里面用使用了 Protobu ...
- 条件分页 分页条件和页参数传递方式一 超链接拼串 方式二 使用查询表单searchForm
<%-- Created by IntelliJ IDEA. User: jie Date: 2019/5/10 Time: 20:00 To change this template use ...
- Eclipse中各图标含义
Eclipse中定义很多小图标,在平时的开发工作中,熟悉这些小图标还是很有意义的.那具体意义大家又知道多少呢? 首先,通过在搜索“eclipse icon meaning”,找到了一个比较有用的链接, ...
- Luogu P2341 [HAOI2006]受欢迎的牛 SCC缩点
把强连通分量缩点,如果有且仅有一个出度为0的强连通分量,那么答案就是他的size:如果有多个入度为0的,那么没有明星牛. #include<cstdio> #include<iost ...
- 位运算>>和>>>区别
int a=-1; Integer b=0; Integer c=0; System.out.println(Integer.toBinaryString(a)); b=a>>1; c=a ...
- Mysql和oracle字段类型与java对象类型对应表收藏
https://blog.csdn.net/michaelzhou224/article/details/16827029 Mysql Oracle Java BIGINT NUMBER(19,0) ...
- oracle查询语句大全 oracle 基本命令大全
oracle查询语句大全 oracle 基本命令大全 来源于:http://download.csdn.net/download/jia584643753/5875619 1.create user ...
- 表单验证插件jquery.validate.js
最常使用JavaScript的场合就是表单的验证,而jQuery作为一个优秀的JavaScript库,也提供了一个优秀的表单验证插件----Validation.Validation是历史最悠久的jQ ...
- 死磕 java并发包之LongAdder源码分析
问题 (1)java8中为什么要新增LongAdder? (2)LongAdder的实现方式? (3)LongAdder与AtomicLong的对比? 简介 LongAdder是java8中新增的原子 ...