12-2-有向无环图的拓扑排序
发布网友
发布时间:2024-09-26 07:47
我来回答
共1个回答
热心网友
时间:2024-09-27 20:08
由某个集合上的一个偏序得到该集合上的一个全序,这个操作被称为拓扑排序。偏序和全序的定义如下:若集合X上的关系R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。如果对于集合X中的任意x,y元素,关系R满足xRy或yRx,则称R是集合X上的全序关系。由偏序定义得到的拓扑有序的操作便是拓扑排序。
拓扑排序的流程如下:重复执行以下两步,直到所有顶点都已输出或当前图中不存在无前驱的顶点。后者表明有向图中存在环。
使用邻接表存储有向图,并通过栈来暂存所有入度为零的顶点。
在本题中,首先读入一个有向图的邻接矩阵(即数组表示),然后根据上述描述的算法建立有向图并判断是否存在回路。如果不存在回路,则输出拓扑有序的顶点序列。
输入形式如下:第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。接下来的n行中,每行有n个用空格隔开的整数0或1。对于第i行的第j个整数,如果为1,则表示第i个顶点有指向第j个顶点的有向边,0表示没有i指向j的有向边。当i和j相等时,对应的整数为0。
输出形式如下:如果读入的有向图含有回路,请输出“ERROR”。如果读入的有向图不含有回路,则按照题目描述中的算法依次输出图的拓扑有序序列,每个整数后输出一个空格。请注意行尾输出换行。
样例输入:4 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0
样例输出:3 0 1 2
说明:为了避免重复检测入度为零的顶点,可以通过一个栈结构维护当前处理过程中入度为零的顶点。