
--Il seguente codice e' privo di commenti. 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]



join :: Node -> [Path] -> [Path]

join n []     = []
join n (p:ps) = (n:p):(join n ps)




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

pathsC [] nA nB = []

pathsC g nA nB 
            | nA == nB          = [[nA]]
            | otherwise         = join  nA subpaths
          where connList = connectedNodes nA g 
                subpaths = (multi_paths (minusNode g nA) connList nB)


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

multi_paths  g [] nB = []

multi_paths  g (n:ns) nB = (pathsC g n nB)++(multi_paths g ns nB)





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

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

