JALLAT_kurska3.ml 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. let rec kaux1 w aretes t =
  51. match aretes with
  52. | [] -> t
  53. | a::aq -> let (i, j) = a in aux i j t; kaux1 w aq t
  54. ;;
  55. (* recursivitŽ terminale en appelant kaux1 avant (aux i j t) ˆ la place de t *)
  56. let kruskal1 w =
  57. let aretes = liste_triee_arrete w in
  58. let t = ref [] in
  59. kaux1 w aretes t;
  60. !t
  61. ;;
  62. (* tu corriges, tu testes et je regarde la suite apr�s et avec des commentaires *)
  63. (* Seconde partie *)
  64. (*une fonction chemin w u v, qui renvoie true s'il existe un chemin entre u et v*)
  65. let chemin w u v =
  66. let n = Array.length w in
  67. let rec aux i =
  68. match i = n with
  69. | true -> false
  70. | false ->
  71. match w.(u).(i) with
  72. | Infini -> aux (i+1)
  73. | Poids(p) ->
  74. match w.(i).(v) with
  75. | Infini -> aux (i+1)
  76. | Poids(q) -> true
  77. in aux 0
  78. ;;
  79. let kruskal2 w =
  80. let n = Array.length w in
  81. let rec aux i =
  82. match i = n with
  83. | true -> []
  84. | false ->
  85. match w.(i) with
  86. | [] -> aux (i+1)
  87. | t::q ->
  88. match chemin w t i with
  89. | true -> (t, i) :: (aux (i+1))
  90. | false -> aux (i+1)
  91. in aux 0
  92. ;;