Skip to content
Extraits de code Groupes Projets
Valider 525beb7a rédigé par Louis Fourcade's avatar Louis Fourcade
Parcourir les fichiers

Merge remote-tracking branch 'origin/master'

parents e107ad1f e6746c9f
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
#include "implems.c"
#include "file.h"
int aff_adjlist(adjlist *g)
{
printf("g->n : %li, g->e : %li\n", g->n, g->e);
printf("%i a %li voisins\n", 0, g->cd[0]);
for (unsigned long i = 1; i < g->n; i++)
{
printf("%li a %li voisins\n", i, g->cd[i] - g->cd[i-1]);
}
return 0;
}
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
int BFS(adjlist* g, unsigned long s){
file_t F = new_file(42);
unsigned long BFS(adjlist *g, unsigned long *s)
{
file_t F = new_file(g->n);
int *marked = (int *)malloc((g->n) * sizeof(int));
for (unsigned long i = 0; i < g->n; i++)
{
marked[i] = 0;
marked[i] = -1;
}
enfile(F,s);
marked[s] = 1;
enfile(F, *s);
marked[*s] = 0;
unsigned long tmp = *s;
while (!is_empty(F))
{
unsigned long tmp = defile(F);
tmp = defile(F);
// printf("%li %li %li %li\n", tmp, marked[tmp], g->cd[tmp], g->cd[tmp+1]);
for (unsigned long i = g->cd[tmp]; i < g->cd[tmp + 1]; i++)
{
if (marked[g->adj[i]] == 0)
if (marked[g->adj[i]] == -1)
{
if (enfile(F, g->adj[i]) == 1)
{
enfile(F,g->adj[i]);
marked[g->adj[i]] = 1;
marked[g->adj[i]] = marked[tmp] + 1;
}
else
{
printf("\n\nPile trop petite !\n\n");
}
}
}
}
unsigned long no_marque = 0;
for (unsigned long i = 0; i < g->n; i++)
{
if (marked[i] == -1 && g->cd[0] != 0)
{
no_marque++;
}
}
*s = tmp;
unsigned long res = marked[tmp];
free(marked);
return res;
}
unsigned long diameter(adjlist *g)
{
if (g->n == 0)
{
return 0;
}
else
{
unsigned long start = 1;
while (g->cd[start] == 0)
{
start++;
}
unsigned long old_depth = -1;
unsigned long new_depth = 0;
while (new_depth != old_depth)
{
old_depth = new_depth;
new_depth = BFS(g, &start);
}
return new_depth;
}
}
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Triangle
// structure de triangles (contient trois noeuds)
typedef struct {
typedef struct
{
unsigned long a;
unsigned long b;
unsigned long c;
......@@ -43,11 +98,13 @@ typedef struct {
// itère sur chaque arêtes
// - récupère les voisins de chaques cotés
// - si les deux sommets ont un voisin plus grand, en commun, on ajoute un triangle
int count_triangles(adjlist* g) {
int count_triangles(adjlist *g)
{
printf("fonction de compte des triangles\n");
int res_nb_tri = 0;
// itère sur les arêts
for (unsigned long e = 0; e < g->e; e++) {
for (unsigned long e = 0; e < g->e; e++)
{
// récupère les deux voisins
unsigned long v1 = g->edges[e].s;
unsigned long v2 = g->edges[e].t;
......@@ -67,19 +124,22 @@ int count_triangles(adjlist* g) {
// on peut améliorer cette recherche si on considère les liste des voisins triées
// ajoute un triangle si sommet plus grand en commun
for (unsigned long i = 0; i < v1_neigh_end - v1_neigh_start; i++) {
for (unsigned long j = 0; j < v2_neigh_end - v2_neigh_start; j++) {
for (unsigned long i = 0; i < v1_neigh_end - v1_neigh_start; i++)
{
for (unsigned long j = 0; j < v2_neigh_end - v2_neigh_start; j++)
{
unsigned long vois_1 = g->adj[i + v1_neigh_start];
unsigned long vois_2 = g->adj[j + v2_neigh_start];
if (vois_1 == vois_2) {
if (vois_1 > v1 && vois_1 > v2) {
if (vois_1 == vois_2)
{
if (vois_1 > v1 && vois_1 > v2)
{
res_nb_tri += 1;
}
}
}
}
}
return res_nb_tri;
......@@ -89,11 +149,13 @@ int count_triangles(adjlist* g) {
// itère sur chaque arêtes
// - récupère les voisins de chaques cotés
// - si les deux sommets ont un voisin plus petit en commun, on ajoute un triangle
int count_triangles_opt(adjlist* g) {
int count_triangles_opt(adjlist *g)
{
printf("fonction de compte des triangles\n");
int res_nb_tri = 0;
// itère sur les arêts
for (unsigned long e = 0; e < g->e; e++) {
for (unsigned long e = 0; e < g->e; e++)
{
// récupère les deux voisins
unsigned long v1 = g->edges[e].s;
unsigned long v2 = g->edges[e].t;
......@@ -113,24 +175,26 @@ int count_triangles_opt(adjlist* g) {
unsigned long i = v1_neigh_start;
unsigned long j = v2_neigh_start;
// version opt, suppose que les voisins sont triés par ordre croissants
while(g->adj[i] < v1 && i < v1_neigh_end) {
while (g->adj[i] < v1 && i < v1_neigh_end)
{
j = v2_neigh_start;
while(g->adj[j] < v2 && j < v2_neigh_end) {
if (g->adj[i] == g->adj[j]) {
while (g->adj[j] < v2 && j < v2_neigh_end)
{
if (g->adj[i] == g->adj[j])
{
res_nb_tri += 1;
}
j += 1;
}
i += 1;
}
}
return res_nb_tri;
}
int count_triangles_std(adjlist* g) {
int count_triangles_std(adjlist *g)
{
int res = 0;
//itère sur les arêtes vers des noeuds plus petits
......@@ -138,15 +202,20 @@ int count_triangles_std(adjlist* g) {
unsigned long vois_1, vois_2;
v1 = 0;
i = 0;
while (v1 < g->n) {
while (g->adj[i] < v1 && i < g->cd[v1+1]) {
while (v1 < g->n)
{
while (g->adj[i] < v1 && i < g->cd[v1 + 1])
{
v2 = g->adj[i];
//on a v1 et v2, maintenant on cherche les voisins communs plus petit que les deux
vois_1 = g->cd[v1];
while (g->adj[vois_1] < v2 && vois_1 < i) {
while (g->adj[vois_1] < v2 && vois_1 < i)
{
vois_2 = g->cd[v2];
while (g->adj[vois_2] < v2 && vois_2 < g->cd[v2+1]) {
if (g->adj[vois_1] == g->adj[vois_2]) {
while (g->adj[vois_2] < v2 && vois_2 < g->cd[v2 + 1])
{
if (g->adj[vois_1] == g->adj[vois_2])
{
res += 1;
}
vois_2++;
......@@ -163,14 +232,13 @@ int count_triangles_std(adjlist* g) {
return res;
}
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
int main(int argc,char** argv){
int main(int argc, char **argv)
{
adjlist *g;
time_t t1, t2, t3;
// PARSING
t1=time(NULL);
......@@ -185,33 +253,31 @@ int main(int argc,char** argv){
printf("Building the adjacency list\n");
mkadjlist(g);
t2=time(NULL);
printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
// DIAMETRE
printf("\n\ncalcul du diamètre\n");
t1 = time(NULL);
printf("diamètre %li\n", diameter(g));
t2 = time(NULL);
printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
// TRIANGLES
printf("\n\ncalcul du nombre de triangles\n");
// t1 = time(NULL);
// printf("%i triangles trouvés opt\n", count_triangles_opt(g));
// t2 = time(NULL);
// printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
t1 = time(NULL);
printf("%i triangles trouvés std\n", count_triangles_std(g));
t2 = time(NULL);
printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60));
free_adjlist(g);
return 0;
}
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter