Haskell中的全套子图

时间:2013-08-15 07:10:01

标签: haskell graph

我遇到了生成长度有限的任何图表的完整子图集的问题。图表表示为有序对的列表,例如:

  

设g = [(1,2),(1,7),(1,3),(2,9),(2,4),(3,5),(4,6),( 5,6),   (7,8),(8,10),(8,9),(10,12),(10,11),(11,13),(12,14),(13,15),(14 ,15)]

一种方法是获得所有子序列,其中对是有界的,但标准函数子序列生成 2 ^ n 变体,因为这些变体中的更多不是有界的,因此表示断开连接的子图。

1 个答案:

答案 0 :(得分:0)

我找到了路, 我们有一个图表

let g = [(1,2),(1,7),(1,3),(2,9),(2,4),(3,5),(4,6),(5,6), (7,8),(8,10),(8,9),(10,12),(10,11),(11,13),(12,14),(13,15),(14,15)]

我们可以通过以下代码获取所有子图:

subgraphs g = nub $ subgraphs' g

subgraphs' [] = [[]]
subgraphs' (x:xz) = subgraphs xz ++ map (contact x) (subgraphs xz) 

contact (i,j) [] = [(i,j)]
contact (i,j) set = if ([i] ++ [j]) `intersect` ((\(f,g) -> f ++ g) $ unzip set) /= [] then ([(i,j)] ++ set) else set

测试它:

*Main> length $ subgraphs g
164