summaryrefslogtreecommitdiff
path: root/80-89/88.hs
diff options
context:
space:
mode:
Diffstat (limited to '80-89/88.hs')
-rw-r--r--80-89/88.hs22
1 files changed, 22 insertions, 0 deletions
diff --git a/80-89/88.hs b/80-89/88.hs
new file mode 100644
index 0000000..6c1123c
--- /dev/null
+++ b/80-89/88.hs
@@ -0,0 +1,22 @@
+import Data.List (partition, foldl')
+
+data Graph a = Graph [a] [(a, a)] deriving (Show, Eq)
+
+connComp :: Eq a => Graph a -> [[a]]
+
+connComp (Graph v e) = fst $ foldl'
+ (\(comps, vis) u -> if u `elem` vis then (comps, vis)
+ else let (s, vis') = dfs u vis in
+ (s:comps, vis'))
+ ([], []) v
+ where adjust u (a, b)
+ | a == u = [b]
+ | b == u = [a]
+ | otherwise = []
+ dfs u vis
+ | u `elem` vis = ([], vis)
+ | otherwise = let vs = (e >>= (adjust u)) in
+ foldl' (\(s, vis') v ->
+ let (s', vis'') = dfs v vis' in
+ (s ++ s', vis''))
+ ([u], u:vis) vs