图论专题小结:拓扑排序

拓扑排序

拓扑排序是针对有向图进行的,拓扑排序有两个作用:(1)针对某种定义好的“小于”关系为结点排序;(2)判断一个有向图中是否存在有向环。我们可以利用DFS来完成拓扑排序。

下面是判断一个有向图g中是否含有有向环的代码:

#define N 100+10
int c[N], g[N][N];//利用二维数组g保存有向图
int n;//结点数,下标从0开始

bool toposort(int u)
{
	c[u] = -1;//正在访问
	for (int v = 0; v < n; v++)
	if (g[u][v])
	{
		if (c[v] < 0)return true;//存在有向环,返回true
		else if (!c[v] && !toposort(v))return true;
	}
	c[u] = 1;//访问结束
	return false;//不存在有向环
}
bool have_circle()
{
	memset(c, 0, sizeof(c));
	for (int i = 0; i < n;i++)
	if (!c[i])
	if (toposort(i))return true;//存在有向环,返回true
	return false;//不存在有向环,返回false
}
时间: 2024-11-05 18:47:31

图论专题小结:拓扑排序的相关文章

图论篇4——拓扑排序

引入 AOV网络 在有向图中,用顶点表示活动,用有向边<Vi, Vj>表示活动 i 是活动 j 的必须条件.这种有向图称为用顶点表示活动的网络(Active on vertices),简称AOV网络. 在AOV网络中,如果活动Vi必须在Vj之前进行,则存在有向边<Vi, Vj>,并称Vi是Vj的直接前驱,Vj是Vi的直接后继.这种前驱与后继的关系具有传递性和反自反性,这要求AOV网络中不能出现回路,即有向环.因此,对于给定的AOV网络,必须先判断它是否存在有向环. 拓扑排序 检测有

图论专题小结:网络流算法之ISAP算法

ISAP算法 ISAP(Improved Shortest Augument Path)算法是改进版的SAP算法,如果对效率要求很高的时候,可以用该算法. (1)概述:算法基于这样的一个事实:每次增广之后,任意结点到汇点(在残余网络中)的最短距离都不会减小.这样,我们可以利用d[i[表示结点i到汇点的距离的下界.然后再增广过程当中不断地修改这个下界.增广的时候和Dinic算法类似,只允许沿着d[i]==d[j]+1的弧(i,j)走. 不难证明,d[i[满足两个条件:(1)d[t]=0;(2)对任

图论基础——邻接链表存图+拓扑排序

邻接链表存图,在这里其实是用数组进行模拟的 又叫做链式存储法,本来是要用链表实现的,但大多数情况下只需要用数组模拟即可 例: u(边的起点) v(边的终点) w(边的权值) 4 2 1 1 2 3 1 4 1 1 5 2 4 3 4 2 3 1 话不多说,直接上代码 for(int i=1;i<=m;i++) { scanf("%d%d%d",&u1,&v1,&w1); e[i].u =u1;//赋给第i条边的起点 e[i].v =v1;//赋给第i条边的

拓扑排序(Topological Sorting)

一.什么是拓扑排序 在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列.且该序列必须满足下面两个条件: 每个顶点出现且只出现一次. 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面. 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说. 例如,下面这个图: 它是一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法: 从 DAG

python多重继承之拓扑排序

在python3中,所有类都是新式类(默认继承obj,具有super,mro方法),采用广度优先,即拓扑排序算法 在python2.7中,新式类和经典类并存,经典类采用深度优先算法,即纵向 super方法本质,不是单纯找父类,而是根据调用者的节点位置进行广度优先顺序来的 一.什么是拓扑排序 在图论中,拓扑排序(Topological Sorting) 是一个 有向无环图(DAG,Directed Acyclic Graph) 的所有顶点的线性序列.且该序列必须满足下面两个条件: 每个顶点出现且只

HDU 2647 Reward(图论-拓扑排序)

Reward Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to distribute rewards to his workers. Now he has a trouble about how to distribute the rewards. The workers will compare their rewards ,a

【图论】拓扑排序应用

拓扑排序虽是一种排序,但是它跟平时所接触的sort或者qsort不同,排序的意义不同.拓扑排序针对有向无回路图(DAG)而言的,不应用与存在回路的有向图. [图论]广度优先搜索和深度优先搜索 有说到了BFS和DFS,拓扑排序是DFS的一个应用. 有向无回路图能说明事件的发生的先后的顺序.比如穿衣服,士兵排队等.一个具体的例子,有N个物体,下面给出物体的重量比较,比如(a,b)表示a比b重等等,问已给出的条件是否会矛盾?其实就是判断用所给条件所组织的一个图中是否会存在环? 在DFS中加入时间戳,完

图论知识整理(2) 拓扑排序、最短路、最小生成树

===================================== 发现以前图论学的很不好,什么都不会,现在开始整理图论知识了 作者就是个蒟蒻,ORZ各位大神们 ===================================== 定义:对一个有向无环图(Directed Acyclic Graph,简称DAG)进行拓扑排序,将图中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前. 说的好像很有道理,然而我并没有看懂它在

数据结构:图论:拓扑排序! 两种方法!

拓扑排序:(1)由偏序变成全序的过程!直观的说,偏序指集合中仅有部分成员之间可比较!而全序指集合中全体成员之间均可比较! (2)将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前. 数据结构中进行拓扑排序的方法: 方法一: (1)在有向图中选一个没有前驱的顶点且输出之! (2)从图中删除该顶点和所有以它为尾的弧. (3)重复上述两部,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止.后一种情况说明有向图中存在环! 代码: #