拓扑排序 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. 拓扑排序的完整源码和测试程序 转载请注明出处 ...
随机推荐
- Mysql相关函数使用和总结(liet、right、substring、substring_index)
一.字段截取 1.从左开始截取字符串 用法:left(str,length),即:leift(被截取字符串,截取长度) 列子:select left(‘www.baidu.com’,8) 结果:www ...
- PHP EXCEL相关
这次的需求是在二次扫描的EXCEL报表中加入一列扫描时间. 扫描的时间之前已经写进日志里了,这次要做的就是把时间读取出来然后作为一列插入报表.其实日志也已经读出来了,要做的就是插入.但插入还是碰到不少 ...
- NET full stack framework
NFX UNISTACK 介绍 学习.NET Core和ASP.NET Core,偶然搜索到NFX UNISTACK,现翻译一下Readme,工程/原文:https://github.com/aumc ...
- 二开获取yigo设计器里查询集合里中的某个SQL
package com.bokesoft.lrp_v3.mid.dongming.service; import java.math.BigDecimal; import java.util.Arra ...
- (转)nginx域名访问的白名单配置梳理
nginx域名访问的白名单配置梳理 原文:http://www.cnblogs.com/kevingrace/p/6086652.html 在日常运维工作中,会碰到这样的需求:设置网站访问只对某些ip ...
- (转)io优化
原文:http://blog.csdn.net/gzh0222/article/details/9227393 1.系统学习 IO性能对于一个系统的影响是至关重要的.一个系统经过多项优化以后,瓶颈往往 ...
- CUBE 隐藏维度中的Unknown
纬度,属性里面有个unknowmember设置为hidden
- 客户端rsyslog配置文件详解
客户端rsyslog配置文件详解 最近再开发一个rsyslog的接收服务端,支持udp,tcp和tls三种协议.所以去仔细研究了一下rsyslog.conf的配置文件,下面来详细说一下. 因为我这儿重 ...
- mui页面间传接值例子
传值页面index.html <!DOCTYPE html><html><head> <meta charset="utf-8"> ...
- .Net平台互操作技术:02. 技术介绍
上一篇文章简单介绍了.Net平台互操作技术的面临的主要问题,以及主要的解决方案.本文将重点介绍使用相对较多的P/Invoke技术的实现:C#通过P/Invoke调用Native C++ Dll技术.C ...