diff --git a/Makefile b/Makefile
index 2dd4ec463506165ed265816eeb9eb2bdc14f9610..24b6500f25f5543a862a9d547ce0a091ecca5635 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@ CC = gcc
 OPTIONS = -Wall -Wextra -O3
 MATH = -lm
 
-EXECUTABLE = TP1 TP2 TP3 TP4 TP4_q4
+EXECUTABLE = TP1 TP2 TP3 TP4 TP4_q4 TP4_metric
 
 
 all: $(EXECUTABLE)
@@ -30,6 +30,8 @@ TP4: TP4.o
 TP4_q4: TP4_q4.o
 	$(CC) $(OPTIONS) -o $@ $^ $(MATH) -g
 
+TP4_metric: TP4_metric.o
+	$(CC) $(OPTIONS) -o $@ $^ $(MATH) -g
 
 # TP1.o: implems.c
 
diff --git a/TP4_metric.c b/TP4_metric.c
new file mode 100644
index 0000000000000000000000000000000000000000..e5caa08217b222307daf292b85c8b4e6739876e2
--- /dev/null
+++ b/TP4_metric.c
@@ -0,0 +1,176 @@
+#include "./implems.c"
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <stdbool.h>
+
+void aff_tab(unsigned long *t, int size)
+{
+	for (int i = 0; i < size; i++)
+	{
+		printf("%li ", t[i]);
+	}
+	printf("\n");
+}
+
+void swap(unsigned long *tab, unsigned long num1, unsigned long num2)
+{
+	unsigned long temp = tab[num1];
+	tab[num1] = tab[num2];
+	tab[num2] = temp;
+}
+
+unsigned long partition(unsigned long *tab, unsigned long *tab_value, unsigned long left, unsigned long right, unsigned long pivot)
+{
+	unsigned long leftPointer = left;
+	unsigned long rightPointer = right;
+
+	while (true)
+	{
+		while (tab_value[tab[leftPointer]] > tab_value[pivot])
+		{
+			leftPointer++;
+			//do nothing
+		}
+
+		while (rightPointer > 0 && tab_value[tab[--rightPointer]] < tab_value[pivot])
+		{
+			//do nothing
+		}
+
+		if (leftPointer >= rightPointer)
+		{
+			break;
+		}
+		else
+		{
+			swap(tab, leftPointer, rightPointer);
+		}
+	}
+
+	swap(tab, leftPointer, right);
+	return leftPointer;
+}
+
+void quickSort(unsigned long *tab, unsigned long *tab_value, unsigned long left, unsigned long right)
+{
+	if (right <= left)
+	{
+		return;
+	}
+	else
+	{
+		unsigned long pivot = tab[right];
+		unsigned long partitionPoint = partition(tab, tab_value, left, right, pivot);
+		if (partitionPoint > 0)
+		{
+			quickSort(tab, tab_value, left, partitionPoint - 1);
+		}
+		quickSort(tab, tab_value, partitionPoint + 1, right);
+	}
+}
+
+unsigned long nb_commu(edgelist *g)
+{
+	unsigned long nb = 0;
+	for (unsigned long i = 0; i < g->e; i++)
+	{
+		nb = (g->edges[i].t > nb) ? g->edges[i].t : nb;
+	}
+	return nb;
+}
+
+unsigned long *size_commu(edgelist *g, unsigned long size)
+{
+	unsigned long *res = (unsigned long *)malloc(sizeof(unsigned long) * size);
+	for (unsigned long i = 0; i < size; i++)
+	{
+		res[i] = 0;
+	}
+
+	for (unsigned long i = 0; i < g->e; i++)
+	{
+		res[g->edges[i].t]++;
+	}
+
+	return res;
+}
+
+unsigned long metric(edgelist *g1, edgelist *g2)
+{
+	unsigned long distance = 0;
+
+	unsigned long nb_commu_1 = nb_commu(g1);
+	unsigned long nb_commu_2 = nb_commu(g2);
+
+	if (nb_commu_2 > nb_commu_1)
+	{
+		unsigned long tmp = nb_commu_1;
+		nb_commu_1 = nb_commu_2;
+		nb_commu_2 = tmp;
+
+		edgelist *gtmp = g1;
+		g1 = g2;
+		g2 = gtmp;
+	}
+
+	unsigned long *size_commu_1 = size_commu(g1, nb_commu_1);
+	unsigned long *size_commu_2 = size_commu(g2, nb_commu_2);
+
+	unsigned long *ordre_1 = (unsigned long *)malloc(sizeof(unsigned long) * nb_commu_1);
+	for (unsigned long i = 0; i < nb_commu_1; i++)
+	{
+		ordre_1[i] = i;
+	}
+	unsigned long *ordre_2 = (unsigned long *)malloc(sizeof(unsigned long) * nb_commu_2);
+	for (unsigned long i = 0; i < nb_commu_2; i++)
+	{
+		ordre_2[i] = i;
+	}
+
+	quickSort(ordre_1, size_commu_1, 0, nb_commu_1 - 1);
+	quickSort(ordre_2, size_commu_2, 0, nb_commu_2 - 1);
+
+	unsigned long ecart = 0;
+
+	for (unsigned long i = 0; i < nb_commu_2; i++)
+	{
+		ecart = (size_commu_1[ordre_1[i]] > size_commu_2[ordre_2[i]]) ? (size_commu_1[ordre_1[i]] - size_commu_2[ordre_2[i]]) : (size_commu_2[ordre_2[i]] - size_commu_1[ordre_1[i]]);
+		distance += ecart * ecart;
+	}
+
+	for (unsigned long i = nb_commu_2; i < nb_commu_1; i++)
+	{
+		ecart = size_commu_1[ordre_1[i]];
+		distance += ecart * ecart;
+	}
+
+	return distance;
+}
+
+int main(int argc, char **argv)
+{
+	if (argc < 3)
+	{
+		printf("deux arguments sont attendus\n");
+		return 1;
+	}
+
+	edgelist *g1;
+	edgelist *g2;
+
+	// PARSING
+	printf("Reading edgelist from file %s\n", argv[1]);
+	g1 = el_readedgelist(argv[1]);
+	printf("Reading edgelist from file %s\n", argv[2]);
+	g2 = el_readedgelist(argv[2]);
+	printf("done\n");
+
+	unsigned long res = metric(g1, g2);
+
+	printf("distance : %li\n", res);
+
+	free_edgelist(g1);
+	free_edgelist(g2);
+	return 0;
+}
diff --git a/small_test_2.txt b/small_test_2.txt
new file mode 100644
index 0000000000000000000000000000000000000000..40da06637b46798e59eeb889c99ec731df239ef1
--- /dev/null
+++ b/small_test_2.txt
@@ -0,0 +1,22 @@
+0   1
+1   1
+2   1
+3   1
+4   1
+5   1
+6   1
+7   1
+8   1
+9   2
+10  2
+11  2
+12  3
+13  3
+14  3
+15  3
+16  3
+17  4
+18  4
+19  4
+20  4
+21  4
\ No newline at end of file