fork download
  1. import System.Environment (getArgs)
  2. import Data.List (sort, nub)
  3.  
  4.  
  5. remdup :: Eq a => [a] -> [a]
  6. remdup [] = []
  7. remdup (x:xs) = x : remdup (filter (/= x) xs)
  8.  
  9. type Graph = [[Int]]
  10.  
  11. -- Depth-first search to explore connected nodes
  12. dfs :: Graph -> Int -> [Int] -> [Int] -> [Int]
  13. dfs graph node visited acc =
  14. if node `elem` visited
  15. then acc
  16. else let connectedNodes = filter (\n -> graph !! node !! n == 1) [0..length graph - 1]
  17. updatedVisited = node : visited
  18. updatedAcc = node : acc
  19. in foldr (\n acc' -> dfs graph n updatedVisited acc') updatedAcc connectedNodes
  20.  
  21. -- Function to find connected components in the graph
  22. connectedComponents :: Graph -> [[Int]]
  23. connectedComponents graph =
  24. let nodes = length graph
  25. initialVisited = replicate nodes False
  26. go [] _ connected = connected
  27. go (node:nodes') visited connected =
  28. if visited !! node
  29. then go nodes' visited connected
  30. else let component = dfs graph node [] []
  31. updatedVisited = foldr (\n v -> v ++ [if n `elem` component then True else False]) visited [0..nodes - 1]
  32. in go nodes' updatedVisited (component : connected)
  33. in reverse $ go [0..nodes - 1] initialVisited []
  34.  
  35. -- Function to parse input into adjacency matrix
  36. parseInput :: String -> Graph
  37. parseInput input = map (map read . words) (lines input)
  38.  
  39.  
  40. -- Main function
  41. main :: IO ()
  42. main = do
  43. args <- getArgs
  44. case args of
  45. [inputFile] -> do
  46. contents <- readFile inputFile
  47. let graph = parseInput contents
  48. components = connectedComponents graph
  49. uniqueComponents = nub (map remdup (map sort components)) -- Sort nodes within each component
  50. putStrLn "Connected components:"
  51. mapM_ print uniqueComponents
  52. _ -> putStrLn "Usage: ./executable input_file"
Success #stdin #stdout 0.01s 5296KB
stdin
0 0 0 
stdout
Usage: ./executable input_file