diff --git a/.ipynb_checkpoints/heldAndKarp-checkpoint.ipynb b/.ipynb_checkpoints/heldAndKarp-checkpoint.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..3907e9630960c50fca0d7e2550b8f5282778031c
--- /dev/null
+++ b/.ipynb_checkpoints/heldAndKarp-checkpoint.ipynb
@@ -0,0 +1,119 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Held \\& Karp algorithm"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "┌ Info: Precompiling Graphs [86223c79-3864-5bf0-83f7-82e725a168b6]\n",
+      "â”” @ Base loading.jl:1260\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Modules loaded\n"
+     ]
+    }
+   ],
+   "source": [
+    "using LinearAlgebra\n",
+    "using JuMP\n",
+    "using Cbc\n",
+    "using Graphs\n",
+    "\n",
+    "println(\"Modules loaded\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "function hk(W)\n",
+    "    \n",
+    "    # Initialization\n",
+    "    n = size(W, 1)\n",
+    "    \n",
+    "    if size(W, 2)!=n\n",
+    "        error(\"Weight matrice must be square\")\n",
+    "    end\n",
+    "    # \n",
+    "    \n",
+    "    λ = zeros(n)\n",
+    "\n",
+    "    g = simple_graph(n-1, is_directed = false)\n",
+    "    W_reduced = W[2:n,2:n]\n",
+    "    z = 0\n",
+    "    while z!=n # While not a tour\n",
+    "        \n",
+    "        # Minimum spanning tree (span_tree : st)\n",
+    "        st = kruskal_minimum_spantree(g, W_reduced)[1]\n",
+    "        \n",
+    "        # Connect vertex 1\n",
+    "        m = Model(Cbc.Optimizer()) # PL(NE) Model\n",
+    "        \n",
+    "        @variable(m, X[1:n, 1:n], Bin)\n",
+    "        \n",
+    "        @objective(m, Min, \n",
+    "            2*sum(λ[2:n]) + \n",
+    "            sum((W[u,v] - λ[u] - λ[v])*X[u,v] for u ∈ 1:n for v ∈ 1:u)\n",
+    "        )\n",
+    "        \n",
+    "        @constraint(m, degreeRoot, sum(X[1,:]) == 2)\n",
+    "        @constraint(m, spanningTree[u ∈ 2:n, v ∈ 2:n], X[u,v] == st[u,v])\n",
+    "        \n",
+    "        optimize!(m)\n",
+    "        \n",
+    "        if !( \n",
+    "                ( termination_status(m) == MOI.OPTIMAL ) || \n",
+    "                ( termination_status(m) == MOI.TIME_LIMIT \n",
+    "                    && has_values(m) ) \n",
+    "            )\n",
+    "            error(\"Couldn't connect vertex 1 (PLNE failed).\")\n",
+    "        end\n",
+    "        \n",
+    "        z = objective_value(m)\n",
+    "        D = [sum(value.(X)[u,:]) for u ∈ 1:n]\n",
+    "        # For the degree, we suppose a null diagonal, to be checked later on\n",
+    "        \n",
+    "        if z!=n # If not a tour, update\n",
+    "            λ .= λ .+ 2.*(2.-D) # Experimenter d'autres règles\n",
+    "        end\n",
+    "        \n",
+    "    end\n",
+    "    \n",
+    "    \n",
+    "end"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Julia 1.4.2",
+   "language": "julia",
+   "name": "julia-1.4"
+  },
+  "language_info": {
+   "file_extension": ".jl",
+   "mimetype": "application/julia",
+   "name": "julia",
+   "version": "1.4.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/heldAndKarp.ipynb b/heldAndKarp.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..3907e9630960c50fca0d7e2550b8f5282778031c
--- /dev/null
+++ b/heldAndKarp.ipynb
@@ -0,0 +1,119 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Held \\& Karp algorithm"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "┌ Info: Precompiling Graphs [86223c79-3864-5bf0-83f7-82e725a168b6]\n",
+      "â”” @ Base loading.jl:1260\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Modules loaded\n"
+     ]
+    }
+   ],
+   "source": [
+    "using LinearAlgebra\n",
+    "using JuMP\n",
+    "using Cbc\n",
+    "using Graphs\n",
+    "\n",
+    "println(\"Modules loaded\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "function hk(W)\n",
+    "    \n",
+    "    # Initialization\n",
+    "    n = size(W, 1)\n",
+    "    \n",
+    "    if size(W, 2)!=n\n",
+    "        error(\"Weight matrice must be square\")\n",
+    "    end\n",
+    "    # \n",
+    "    \n",
+    "    λ = zeros(n)\n",
+    "\n",
+    "    g = simple_graph(n-1, is_directed = false)\n",
+    "    W_reduced = W[2:n,2:n]\n",
+    "    z = 0\n",
+    "    while z!=n # While not a tour\n",
+    "        \n",
+    "        # Minimum spanning tree (span_tree : st)\n",
+    "        st = kruskal_minimum_spantree(g, W_reduced)[1]\n",
+    "        \n",
+    "        # Connect vertex 1\n",
+    "        m = Model(Cbc.Optimizer()) # PL(NE) Model\n",
+    "        \n",
+    "        @variable(m, X[1:n, 1:n], Bin)\n",
+    "        \n",
+    "        @objective(m, Min, \n",
+    "            2*sum(λ[2:n]) + \n",
+    "            sum((W[u,v] - λ[u] - λ[v])*X[u,v] for u ∈ 1:n for v ∈ 1:u)\n",
+    "        )\n",
+    "        \n",
+    "        @constraint(m, degreeRoot, sum(X[1,:]) == 2)\n",
+    "        @constraint(m, spanningTree[u ∈ 2:n, v ∈ 2:n], X[u,v] == st[u,v])\n",
+    "        \n",
+    "        optimize!(m)\n",
+    "        \n",
+    "        if !( \n",
+    "                ( termination_status(m) == MOI.OPTIMAL ) || \n",
+    "                ( termination_status(m) == MOI.TIME_LIMIT \n",
+    "                    && has_values(m) ) \n",
+    "            )\n",
+    "            error(\"Couldn't connect vertex 1 (PLNE failed).\")\n",
+    "        end\n",
+    "        \n",
+    "        z = objective_value(m)\n",
+    "        D = [sum(value.(X)[u,:]) for u ∈ 1:n]\n",
+    "        # For the degree, we suppose a null diagonal, to be checked later on\n",
+    "        \n",
+    "        if z!=n # If not a tour, update\n",
+    "            λ .= λ .+ 2.*(2.-D) # Experimenter d'autres règles\n",
+    "        end\n",
+    "        \n",
+    "    end\n",
+    "    \n",
+    "    \n",
+    "end"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Julia 1.4.2",
+   "language": "julia",
+   "name": "julia-1.4"
+  },
+  "language_info": {
+   "file_extension": ".jl",
+   "mimetype": "application/julia",
+   "name": "julia",
+   "version": "1.4.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}