-- Il seguente codice non e' commentato. COmmentarlo.

mygraph = [(1,2),(1,4),(1,3),(2,3),(2,5),(3,4),(3,5),(4,5)]






removeduplicates [] = []

removeduplicates (x:xs) = x:[ y | y<-(removeduplicates xs), not(x == y)]
                    


type Node = Integer 

type Arc = (Node,Node)

type Graph =[Arc]

type Path = [Node]


connected :: Node -> Node -> Graph -> Bool

connected n1 n2 g  = not (null [(x,y) | (x,y) <- g, (n1==x && n2==y) || (n1==y && n2==x)])


connectedNodes :: Node -> Graph -> [Node]

connectedNodes nA g  = removeduplicates [ x | (x,y) <- g,  (nA == y) ]++[ y | (x,y) <- g, (nA == x)]


minusNode :: Graph -> Node -> Graph

minusNode g n = [(x,y) | (x,y)<-g, not(x==n), not(y==n) ]


complete :: Graph -> Graph

complete [] = []

complete g = removeduplicates g++[(x,x) | (x,y)<- g]++[(y,y) | (x,y)<-g]



  





pathsC :: Graph -> Node -> Node -> [Path]

pathsC [] nA nB = []

pathsC g nA nB 
            | nA == nB          = [[nA]]
            | otherwise         =   subpaths >>= \x -> [(nA:x)] 
          where connList = connectedNodes nA g 
                subpaths = connList >>= \x -> (pathsC (minusNode g nA) x nB)







paths :: Graph -> Node -> Node -> [Path]

paths g nA nB = pathsC (complete g) nA nB
 


