在验证有向无环图相关的各种算法时需要一些测试数据,手动构造的话太麻烦了,于是便想着能不能自动生成一些测试数据来。这个问题的难点在于如何保证生成的图没有环,查了一下相关资料,这个可以借助拓扑排序的原理来实现,想象一下一个有向无环图要对其拓扑排序,需要从图中找出一个入度为0的顶点,将它和它的出边都从图中删除,重复执行这个操作直到图为空,只需要逆向执行这个过程即可从拓扑排序的结果恢复出一个有向无环图,比如下面这个有向无环图:

java实现有向无环图拓扑排序 有向无环图数据结构_测试数据

对其拓扑排序的结果是:

a, b, c

那么只需要随机地将前面顶点连接到后面顶点即可将拓扑排序的结果还原为有向无环图,比如随机地从a连向b或c,从b连向c,不过需要注意的是因为拓扑排序会丢失边的信息,所以这个还原并不能保证和原图一致。

下面是针对这个原理写的一个工具类,输入拓扑排序,根据此拓扑排序生成随机有向无环图。

表示顶点和其邻接关系的实体类:

然后是根据拓扑排序生成DAG的工具类:

为了更直观的观察生成的结果,我们将其绘制为图形,这里使用dot language,IDEA可以借助PlatUML插件方便的渲染,这里不是介绍工具或语言的用法的,如有兴趣请自行查阅相关资料。

测试类,将生成结果转换为dot language以渲染:

新建.puml文件,将上面的输出粘贴进去:

查看渲染效果:

java实现有向无环图拓扑排序 有向无环图数据结构_java实现有向无环图拓扑排序_02

通过图形渲染,能够更直观的看到,生成的确实是一个有向无环图,至此实现了测试数据可以自动生成,下面的实验可以开心的继续下去了。

.