JALLAT_kurska2.ml 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. type 'a poids = Poids of 'a | Infini;;
  2. let g = [|
  3. [|Infini; Poids(9); Infini; Poids(5); Infini; Infini; Infini|];
  4. [|Poids(7); Infini; Poids(8); Poids(9); Poids(7); Infini; Infini|];
  5. [|Infini; Poids(8); Infini; Infini; Poids(5); Infini; Infini|];
  6. [|Poids(5); Poids(9); Infini; Infini; Poids(15); Poids(6); Infini|];
  7. [|Infini; Poids(7); Poids(5); Poids(15); Infini; Poids(8); Poids(9)|];
  8. [|Infini; Infini; Infini; Poids(6); Poids(8); Infini; Poids(11)|];
  9. [|Infini; Infini; Infini; Infini; Poids(9); Poids(11); Infini|];
  10. |];;
  11. (* Žcrire plut™t Poids 9 que Poids(9) , comme on Žcrit plut™t f x que f(x) *)
  12. let rec insere i x l =
  13. match l with
  14. | [] -> [i]
  15. | t::q -> if x > t then i :: l else t :: (insere i x q)
  16. ;;
  17. (* myst�re ... i sera l'ar�te et x le poids, merci pour les explications ! *)
  18. (* tu compares x et t , x et t sont donc de m�me type *)
  19. let liste_triee_arrete w =
  20. let l = ref [] and n = Array.length w.(0) in
  21. for i = 0 to n - 2 do
  22. for j = i + 1 to (n - 1) do
  23. if w.(i).(j) <> Infini then
  24. match w.(i).(j) with
  25. | Poids(p) -> (l := insere (i, j) p !l)
  26. | Infini -> ()
  27. else ()
  28. done;
  29. done;
  30. !l
  31. ;;
  32. (* mauvaise orientation : une liste, tu proposes une fonction rŽcursive et tu Žvites les rŽfŽrences de listes *)
  33. (* tu tries par ordre dŽcroissant, non ? *)
  34. (* la fonction insere oblige (i,j) et p ˆ �tre de m�me type, c'est pour �a que w doit etre de type (int*int) ... *)
  35. (* l'alternative et le filtrage, un peu redondant ... *)
  36. let n = Array.length g.(0);;
  37. let composantes = Array.make n 0;;
  38. (* tous les sommets sont dans la composante connexe du sommet 0 ? *)
  39. let aretes = liste_triee_arrete g;;
  40. let aux i j t =
  41. let ci = composantes.(i) and cj = composantes.(j) in
  42. match ci = cj with
  43. | true -> ()
  44. | false ->
  45. t := (i, j) :: !t;
  46. for k = 0 to n - 1 do
  47. if composantes.(k) = cj then composantes.(k) <- ci;
  48. done
  49. ;;
  50. (* t a une valeur avant l'appel ˆ aux, il est modifiŽ pendant aux et il reprend sa valeur initiale apr�s aux,
  51. la structure d'une rŽfŽrence n'est pas la m�me chose qu'un mutable *)
  52. (* la fonction aux devrait renvoyer t *)
  53. let rec kaux1 w aretes t =
  54. match aretes with
  55. | [] -> t
  56. | a::aq -> let (i, j) = a in aux i j t; kaux1 w aq t
  57. ;;
  58. (* recursivitŽ terminale en appelant kaux1 avant (aux i j t) ˆ la place de t *)
  59. let kruskal1 w =
  60. let aretes = liste_triee_arrete w in
  61. let t = ref [] in
  62. kaux1 w aretes t;
  63. !t
  64. ;;
  65. (* tu corriges, tu testes et je regarde la suite apr�s et avec des commentaires *)
  66. (* Seconde partie *)
  67. (*une fonction chemin w u v, qui renvoie true s'il existe un chemin entre u et v*)
  68. let chemin w u v =
  69. let n = Array.length w in
  70. let rec aux i =
  71. match i = n with
  72. | true -> false
  73. | false ->
  74. match w.(u).(i) with
  75. | Infini -> aux (i+1)
  76. | Poids(p) ->
  77. match w.(i).(v) with
  78. | Infini -> aux (i+1)
  79. | Poids(q) -> true
  80. in aux 0
  81. ;;
  82. let kruskal2 w =
  83. let n = Array.length w in
  84. let rec aux i =
  85. match i = n with
  86. | true -> []
  87. | false ->
  88. match w.(i) with
  89. | [] -> aux (i+1)
  90. | t::q ->
  91. match chemin w t i with
  92. | true -> (t, i) :: (aux (i+1))
  93. | false -> aux (i+1)
  94. in aux 0
  95. ;;