diff --git a/Makefile b/Makefile
index 6949d32194970f9026bbca44dba00580e89813e7..1767d5b11c6761c764366fc6dd3a6807761934ba 100644
--- a/Makefile
+++ b/Makefile
@@ -9,11 +9,11 @@
 
 all: phase1 phase2
 
-phase1: src/main.ml
-	ocamlc $^ -o build/a.out
+phase1: src/phase1.ml
+	ocamlc $^ -o build/phase1.out
 
-phase2: 
-	echo TODO
+phase2: src/phase2.ml
+	ocamlc $^ -o build/phase2.out
 
 clean:
 	rm -rf *.cmi *.cmo
diff --git a/src/main.ml b/src/phase1.ml
similarity index 97%
rename from src/main.ml
rename to src/phase1.ml
index ce54a3889e23107ec6dc2aa2e601edda1e63ef65..1b9d4752e0eea5f934caeef78e156f051b181572 100644
--- a/src/main.ml
+++ b/src/phase1.ml
@@ -1,5 +1,5 @@
 (*
- * fichier : main.ml
+ * fichier : phase1.ml
  * auteur : dubard loïc
  *)
 
@@ -116,7 +116,6 @@ let plus_courts_chemins s p c =
     in
     remplissage liste distances minimum
 
-(* TODO : ne pas oublier de supprimer les chemins qui n'arrive pas à puits *)
 
 (* test du dénombrement de l'ensemble des chemins possibles *)
 let _ = 
diff --git a/src/phase2.ml b/src/phase2.ml
new file mode 100644
index 0000000000000000000000000000000000000000..4727840260674f4aee221d018083d9d23c7ee925
--- /dev/null
+++ b/src/phase2.ml
@@ -0,0 +1,87 @@
+(*
+ * fichier : phase2.ml
+ * auteur : dubard loïc
+ *)
+
+ (*
+ * définition du type graphe qui est une map de liste dont les clés sont des string
+ *)
+module Graphe = Map.Make(String)
+module Arreteliste = Map.Make(String)
+module Clesliste = Set.Make(String)
+
+
+(*
+ * @ensures : vérification du nombre d'agruments
+ * @raises : erreur si le nombre d'aguments est différent de 1
+ *)
+let _ = if Array.length Sys.argv = 1
+    then failwith "Erreur : Veuillez ajouter un nom de fichier !\n"
+    else if Array.length Sys.argv > 2
+    then failwith "Erreur : Trop d'arguments !\n"
+    else Printf.printf "ouverture de : %s\n" Sys.argv.(1)
+
+(*
+ * @ensures : lit le fichier en entrée
+ * @raises : fail si le fichier n'est pas trouvé -> "No such file or directory"
+ *)
+let file = open_in Sys.argv.(1)
+let source = input_line file
+let puits = input_line file
+let n = input_line file
+
+
+(*
+ * [make_graphe n]  
+ * @ensures : retourne le "graphe" à n arrètes correspondant au fichier ouvert dans le channel file
+ *)
+let rec make_graphe n = 
+    let line = input_line file in
+    let l = String.split_on_char ' ' line in
+    match l with 
+    | [a ; b ; c] -> if n = 1
+        then (Graphe.add a (Arreteliste.add b c Arreteliste.empty) Graphe.empty)
+        else 
+            let g = make_graphe (n-1) 
+            in 
+            if (Graphe.mem a g)
+                then let l = Graphe.find a g in 
+                let f = Graphe.remove a g in
+                Graphe.add a (Arreteliste.add b c l) f
+                else Graphe.add a (Arreteliste.add b c Arreteliste.empty) g
+    | _ -> failwith("erreur dans le graphe !")
+
+(* 
+ * [liste_sommets g]
+ * @ensures : la listes des clés de la liste d'arrete g
+ *)
+ let liste_sommets g = 
+  let f k v a = k::a
+  in 
+  Arreteliste.fold f g []
+
+(* 
+ * [chemins s g] donne la liste de tous les chemins du graphe g partants de s, un chemin étant une liste de sommets
+ *)
+let rec chemins s g  = 
+  if (Graphe.mem s g) 
+  then 
+      let ng = Graphe.remove s g in
+      (*[f a] retourne la liste des chemins depuis a dans le graphe sans s *)
+      let f a = 
+          let l = chemins a ng in
+          (List.map (fun b -> if (List.mem a b) then b else a::b) l)
+      in
+      let toto = Graphe.find s g in
+      let tata = liste_sommets toto in
+      let titi = List.concat(List.map f tata) in
+      List.map (fun b -> if (List.mem s b) then b else s::b) titi
+  else [[s]]
+
+(*
+ * [filtre f t nl] pour une liste de chemins nl renvois uniquement la liste des chemins partants de f et arrivants à t 
+ * un chemin étant une liste de sommets
+ *)
+let rec filtre f t nl = match nl with
+  | [] -> []
+  | elt::ma -> if (List.nth elt 0) = f && (List.nth elt ((List.length elt)-1)) = t then elt::(filtre f t ma) else (filtre f t ma)
\ No newline at end of file