求一个算法!!!!

2025-01-02 17:04:34
推荐回答(1个)
回答1:

给出一个非连通的有向图,要求输出所有拓扑排序的序列,可以有多种方法,这里提供一种方法,采用一个队列记录所有输出过的结果,其实就是回溯法,大概思路如下:

void topsort(Graph& G,int i) //正在对图G中第i个结点进行排序
{
if(G为空)
输出队列中的排序结果
else
{
if ( G不存在入度为0的节点 )
{
图G存在回路,无法拓扑排序
}
else
{
for (G中每个入度为0的节点v)
{
先将v插入拓扑排序的队列中的第i个位置上
然后将v从图G中删除,但是把v和它的边保存下来,因为后面回溯需要这些数据
topsort(G,i+1);
将刚才删除的v及其所有的边恢复
}
}
}
}

然后我们再来看看相关的例题:

ZOJ 1083

题目的大意是 几个由字母组成的方框(边框是大写字母,中间由.组成),按照某种顺序重叠起来。现在已知重叠后的图案,编程输出方框从底到顶的排列顺序。

这是一道又可以归为拓扑排序的问题。方框2如果在方框1的上面,那么方框2的边框必然和方框1的边框有重叠。如字母B重叠了字母A,则字母A表示的顶点到字母B表示的顶点之间就有一条有向边。算法过程是:
1. 通过给出的屏幕构建有向网络
2. 通过搜索输出所有符合要求的排列顺序(按字典顺序)

现在关键问题是如何构建有向网络,即如何判断某个字母重叠了另外的字 母。首先要确定方框的位置,注意题目中的" It is possible to see at least one part of each of the four sides of a frame. A corner shows two sides.",可以确定方框四个顶点的位置,然后在4条边框上搜索,如果存在和这个方框字母不同的其它字母,则构成一条有向边。