当前位置:编程学习 > C/C++ >>

zoj1060,poj1094--拓扑排序

题意描述:
给定字母表的前n个大些字母,以及这些字母间两两之间的大小关系(这样的关系给定m组),问由这m组关系能否确定n个字母的整体顺序,如果能输出按续排列的字母。
显然,本题就是拓扑排序,不过题目的要求使得我们要处理一些细节。
下面我先说以下拓扑排序:
严蔚敏《数据结构》上的定义是:由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
直观的说偏序指集合中仅有部分成员之间可比较,而全序指集合中全体成员之间均可比较。
举个例子,一个大的工程通常有许多小的工程组成,这些小工程之间通常存在某些先后顺序;当然有些小工程之间不存在先后关系,它们是可以并行的。如果两个小工程直接或间接的相互依赖,就是两个小工程互为对方的先行条件,整个工程将无法进行下去。用一个个顶点分别表示这些小工程,用有向的边表示小工程之间的依赖关系,我们可以得到一个有向图。
拓扑排序可以帮助我们确定这些小工程开始的顺序,并且能够判定小工程之间是否存在相互依赖(图中是否有回路)。
拓扑排序的具体做法是:
1.在有向图中选择一个没有前驱(入度为0)的顶点,输出
2.从图中删除该顶点和所有以它为尾的弧,并更新相关点的入度
3.重复1,2步,直到所有顶点都被输出,或者发现图中存在回路。
如果结合上面所举的工程的例子,没有依赖(先后)关系的工程是可以并行的,但是就本题(zoj1060)而言,它要求每两个点之间的关系都是确定的,是不允许出现并行的,所以,当某一时刻,我们发现入度为0的点不止1个时,排序就失败了。
本题的输出分为三种情况,并且要求输出所用的条件个数,因此每增加一个条件就要做一次拓扑排序。
以下是本题代码,第一次写,有点乱,将就一下把~~
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,