Article     Discussion     Modifier     Historique     Forums     Salon IRC

Warshall

Un article de Games Creators Network.


Warshall est un algorithme qui réalise la fermeture transitive d'un graphe.

Il s'agit d'un algorithme présentant une complexité importante (de l'ordre de n3). On l'utilise donc avec des graphes statiques évoluant peu.

Sommaire

[modifier] Principe

La première boucle effecture une copie du graphe. Puis, on parcourt le graphe via une triple boucle en faisant varier 3 indices: i,j et k. S'il existe un arc de i vers k et de k vers j, alors il existe un chemin de i vers j. On ajoute donc un arc i -> j.

[modifier] Spécifications

Warshall prend en paramètre un graphe et renvoit un second graphe représentant la fermeture transitive de ce dernier.

[modifier] Implémentation

[modifier] C

t_graphe_s Warshall(t_graphe_s g)
{          
     t_graphe_s res;
     int i,j,k;
     

     res=init_graphe(g.ordre, g.estOriente);
     for(i=0;i<g.ordre;i++)
        for(j=0;j<g.ordre;j++)     
           *(res.adj+i*g.ordre+j) = *(g.adj+i*g.ordre+j);
           
     for(k=0;k<g.ordre;k++)
        for(i=0;i<g.ordre;i++)
           for(j=0;j<g.ordre;j++)
              if((*(g.adj+i*g.ordre+j)!=0.)||( (*(g.adj+i*g.ordre+k)!=0.) && (*(g.adj+k*g.ordre+j)!=0.)))
              {
                 printf("ajout du lien %d -> %d car chemin %d -> %d -> %d\n",i,j,i,k,j);
                 *(res.adj+i*g.ordre+j) = 1.;
              } else {
                 printf("pas d'ajout de lien %d -> %d car pas de chemin %d -> %d -> %d\n",i,j,i,k,j);
              }
              
     return res;
}

 

Rechercher
Installer l'extension de recherche Plus d'informations

 

Comprendre
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

 

Partager
La connaissance est la seule chose qui s'accroit lorsqu'on la partage. - Sacha Boudjema

 

Créer
L'imagination est plus importante que la connaissance. - Albert Einstein

 

 

Le wiki en images Le wiki en images Image du mois: «Snowball: un prototype de jeu développé avec NeL.