diff --git a/TP2.c b/TP2.c
index dc4d9d9f027517eed19b938995c19e0f65678aae..36ae093d160c3a8aad9f395f40bb97f8c545221b 100644
--- a/TP2.c
+++ b/TP2.c
@@ -217,6 +217,7 @@ int main(int argc, char **argv) {
 
 	
 	printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
+	// printf("- Overall time = %I64dh%I64dm%I64ds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
 	printf("core value du graphe : %i\n", max_c_val(c, g->n));
 
 	// calcul du densest prefix graph
@@ -227,7 +228,9 @@ int main(int argc, char **argv) {
 	indix_densest = compute_densest_core_ordering_prefix(g, eta, &densest_cop_av_deg_dens, &densest_cop_edge_dens);
 	t2=time(NULL);
 	printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
+	// printf("- Overall time = %I64dh%I64dm%I64ds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
 	printf("densest core prefix :\n\taverage degre density : %Lf\n\tedge density : %Lf\n\tsize : %lu\n", densest_cop_av_deg_dens, densest_cop_edge_dens, indix_densest+1);
+	// printf("densest core prefix :\n\taverage degre density : %f\n\tedge density : %f\n\tsize : %lu\n", (double) densest_cop_av_deg_dens, (double) densest_cop_edge_dens, indix_densest+1);
 
 
 	free_adjlist(g);
diff --git a/TP4.c b/TP4.c
index 4be65d6ed3d9b79d16278d9a426748a13520a63b..cb9ebe38f9c9c32f89a9a4d180c386ed5e4f974b 100644
--- a/TP4.c
+++ b/TP4.c
@@ -1,70 +1,291 @@
 #include "./implems.c"
 #include <stdio.h>
 #include <stdlib.h>
+#include <time.h>
 
-// génère un entier aléatoire entre min et max inclue
-int randint_from(int min, int max)
+// génère un nombre aléatoire sur 4 octets
+unsigned long randlu()
 {
-    int range = (max - min);
-    return min + (rand() % (range + 1));
+	unsigned long res = 0;
+	unsigned long tmp1 = rand() & 0x0F;
+	unsigned long tmp2 = rand() & 0x0F;
+	unsigned long tmp3 = rand() & 0x0F;
+	unsigned long tmp4 = rand() & 0x0F;
+
+	tmp2 = tmp2 << 8;
+	tmp3 = tmp3 << 16;
+	tmp4 = tmp4 << 24;
+
+	res = res | tmp1;
+	res = res | tmp2;
+	res = res | tmp3;
+	res = res | tmp4;
+
+	return res;
 }
 
+// génère un nombre aléatoire sur 4 octets entre min et max inclue
+unsigned long randlu_from(unsigned long min, unsigned long max)
+{
+	unsigned long range = (max - min);
+	return min + (randlu() % (range + 1));
+}
 
-void Fisher_Yates(int *tab, int size) {
-	int tmp;
-	int rdm;
-	for (int i = size-1; i > 0; i--)
+void Fisher_Yates(unsigned long *tab, unsigned long size)
+{
+	unsigned long tmp;
+	unsigned long rdm;
+	for (unsigned long i = size - 1; i > 0; i--)
 	{
-		rdm = randint_from(0, i);
+		rdm = randlu_from(0, i);
 		tmp = tab[i];
 		tab[i] = tab[rdm];
 		tab[rdm] = tmp;
 	}
 }
 
+int ajuste_label(adjlist *g, unsigned long *label, unsigned long *label_count, unsigned long node)
+{
 
+	for (unsigned long i = 0; i < g->n; i++)
+	{
+		label_count[i] = 0;
+	}
 
+	for (unsigned long i = g->cd[node]; i < g->cd[node + 1]; i++)
+	{
+		label_count[label[g->adj[i]]]++;
+	}
 
+	unsigned long nb = 1;
+	unsigned long best = label_count[0];
 
+	for (unsigned long i = 1; i < g->n; i++)
+	{
+		if (label_count[i] > best)
+		{
+			best = label_count[i];
+			nb = 1;
+		}
+		else if (label_count[i] == best)
+		{
+			nb++;
+		}
+	}
 
-int main(int argc, char **argv) {
-	if (argc < 2) {
-		printf("un argument est attendu\n");
-		return 1;
+	if (label_count[label[node]] == best)
+	{
+		return 0;
+	}
+
+	unsigned long chosen = randlu_from(1, nb);
+	unsigned long i = 0;
+
+	while (i < g->n && chosen > 0)
+	{
+		if (label_count[i] == best)
+		{
+			chosen--;
+			if (chosen == 0)
+			{
+				label[node] = label[i];
+				i = g->n;
+			}
+		}
+		i++;
+	}
+	if (chosen != 0)
+	{
+		printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
 	}
 
+	return 1;
+}
 
+unsigned long *label_propagation(adjlist *g)
+{
+	unsigned long *ordre = (unsigned long *)malloc(sizeof(unsigned long) * g->n);
+	unsigned long *label = (unsigned long *)malloc(sizeof(unsigned long) * g->n);
+	unsigned long *label_count = (unsigned long *)malloc(sizeof(unsigned long) * g->n);
+
+	for (unsigned long i = 0; i < g->n; i++)
+	{
+		ordre[i] = i;
+		label[i] = i;
+	}
+
+	int in_progress = 1;
+
+	while (in_progress)
+	{
+		in_progress = 0;
+		Fisher_Yates(ordre, g->n);
+		for (unsigned long i = 0; i < g->n; i++)
+		{
+			in_progress = in_progress | ajuste_label(g, label, label_count, ordre[i]);
+		}
+	}
+
+	free(ordre);
+	free(label_count);
+	return label;
+}
+
+void aff_tab(unsigned long *t, int size)
+{
+	for (int i = 0; i < size; i++)
+	{
+		printf("%li ", t[i]);
+	}
+	printf("\n");
+}
+
+// -----------------------------------------------------------------------------------------------------------------------------------------
+
+void simplifie_label(unsigned long *label, unsigned long size)
+{
+	unsigned long c = 0;
+	unsigned long smallest = size;
+	unsigned long in_progress = 1;
+	while (in_progress)
+	{
+		in_progress = 0;
+		smallest = size;
+		for (unsigned long i = 0; i < size; i++)
+		{
+			if (label[i] >= c && label[i] < smallest)
+			{
+				smallest = label[i];
+				in_progress = 1;
+			}
+		}
+		for (unsigned long i = 0; i < size; i++)
+		{
+			if (label[i] == smallest)
+			{
+				label[i] = c;
+			}
+		}
+		c++;
+	}
+}
+
+void output_graphe(adjlist *g, unsigned long *label, char *filename)
+{
+	FILE *ptr;
+	unsigned long tmp_nb_node;
+
+	tmp_nb_node = g->n;
+
+	ptr = fopen(filename, "w");
+
+	//définition des noeuds
+	fprintf(ptr, "graph D {\n");
+	//noeuds
+	for (unsigned long k = 0; k < tmp_nb_node; k++)
+	{
+		fprintf(ptr, "%li [", k);
+		switch (label[k])
+		{
+		case 0:
+			fprintf(ptr, "color=red");
+			break;
+		case 1:
+			fprintf(ptr, "color=blue");
+			break;
+		case 2:
+			fprintf(ptr, "color=green");
+			break;
+		case 3:
+			fprintf(ptr, "color=yellow");
+			break;
+		case 4:
+			fprintf(ptr, "color=black");
+			break;
+		case 5:
+			fprintf(ptr, "color=brown");
+			break;
+		case 6:
+			fprintf(ptr, "color=orange");
+			break;
+		case 7:
+			fprintf(ptr, "color=grey");
+			break;
+		case 8:
+			fprintf(ptr, "color=magenta");
+			break;
+		case 9:
+			fprintf(ptr, "color=aqua");
+			break;
+		case 10:
+			fprintf(ptr, "color=lime");
+			break;
+
+		default:
+			fprintf(ptr, "color=white");
+			break;
+		}
+
+		fprintf(ptr, "]\n");
+	}
+
+	for (unsigned long k = 0; k < tmp_nb_node; k++)
+	{
+		for (unsigned long i = g->cd[k]; i < g->cd[k + 1]; i++)
+		{
+			if (g->adj[i] > k)
+			{
+				fprintf(ptr, "%li -- %li\n", k, g->adj[i]);
+			}
+		}
+	}
+	fprintf(ptr, "}");
+	fclose(ptr);
+	return;
+}
+
+// -----------------------------------------------------------------------------------------------------------------------------------------
+
+int main(int argc, char **argv)
+{
+	if (argc < 2)
+	{
+		printf("un argument est attendu\n");
+		return 1;
+	}
 
 	adjlist *g;
 	time_t t1, t2, t3;
 
 	// PARSING
-	t1=time(NULL);
+	t1 = time(NULL);
 
-	printf("Reading edgelist from file %s\n",argv[1]);
-	g=al_readedgelist(argv[1]);
+	printf("Reading edgelist from file %s\n", argv[1]);
+	g = al_readedgelist(argv[1]);
 	t3 = time(NULL);
-	// printf("- edge list time = %ldh%ldm%lds\n",(t3-t1)/3600,((t3-t1)%3600)/60,((t3-t1)%60));
-	printf("- edge list time = %I64dh%I64dm%I64ds\n",(t3-t1)/3600,((t3-t1)%3600)/60,((t3-t1)%60));
+	printf("- edge list time = %ldh%ldm%lds\n",(t3-t1)/3600,((t3-t1)%3600)/60,((t3-t1)%60));
+	// printf("- edge list time = %I64dh%I64dm%I64ds\n", (t3 - t1) / 3600, ((t3 - t1) % 3600) / 60, ((t3 - t1) % 60));
 
-	printf("Number of nodes: %lu\n",g->n);
-	printf("Number of edges: %lu\n",g->e);
+	printf("Number of nodes: %lu\n", g->n);
+	printf("Number of edges: %lu\n", g->e);
 
 	printf("Building the adjacency list\n");
 	mkadjlist(g);
 
-	t2=time(NULL);
+	t2 = time(NULL);
+
+	printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
+	// printf("- Overall time = %I64dh%I64dm%I64ds\n", (t2 - t1) / 3600, ((t2 - t1) % 3600) / 60, ((t2 - t1) % 60));
 
-	// printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
-	printf("- Overall time = %I64dh%I64dm%I64ds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
+	srand(time(NULL));
 
-	unsigned long a = 1;
+	unsigned long *res = label_propagation(g);
 
-	printf("%I64i %I64i %I64i %i %li\n", sizeof(int), sizeof(unsigned long), sizeof(unsigned long long), RAND_MAX, a);
+	simplifie_label(res, g->n);
+	output_graphe(g, res, "toto.dot");
 
+	printf("run {dot -Tpng -o out.png toto.dot} pour avoir une visualisation de la solution\n");
 
 	free_adjlist(g);
 	return 0;
 }
-
-