Valid XHTML     Valid CSS2    

Listing du fichier matadj.php

 

00001     <?php
00002     
# # (gH) -_- matadj.php ; TimeStamp (unix) : 06 Août 2014 vers 16:06
00003     
00004     
error_reporting(E_ALL | E_NOTICE ) ;
00005     
00006     
###################################################################################
00007     ###################################################################################
00008     
00009     
echo
"\n\nMatrice d'adjacence d'un graphe dont on connait les listes d'adjacence.\n\n" ;
00010     
00011     
###################################################################################
00012     ###################################################################################
00013     
00014     # aide éventuelle
00015     
00016     ###################################################################################
00017     
00018     
if (!isset(
$argv[1])) {
00019     
00020      echo
"\n" ;
00021      echo
"syntaxe : php matadj.php fichier_LISTADJ\n" ;
00022      echo
"exemple : php matadj.php ladj.txt où le fichier ladj.txt est:\n" ;
00023      echo
"\n" ;
00024     
00025      echo
"html head body \n" ;
00026      echo
"head \n" ;
00027      echo
"body \n" ;
00028      echo
"title \n" ;
00029      echo
"\n" ;
00030     
00031      echo
"Le graphe résultat est visible à l'adresse\n\n" ;
00032      echo
" http://forge.info.univ-angers.fr/~gh/Pagsd/xhtml.png\n" ;
00033     
00034      echo
"\n" ;
00035      exit(-
1) ;
00036     
00037     }
# fin si
00038     
00039     ###################################################################################
00040     
00041     # lecture du fichier, on en déduit le nombre de sommets
00042     
00043     ###################################################################################
00044     
00045     
$dbg
= 1 ; /* mettre 1 pour les cours et pour affichage détaillé */
00046     
00047     
$nomf
= $argv[1] ;
00048     if (!
file_exists
($nomf)) {
00049      echo
"\n" ;
00050      echo
"Fichier
$nomf non vu. STOP.\n" ;
00051      echo
"\n" ;
00052      exit(-
1) ;
00053     }
# fin si
00054     
00055     
$nbsom
= -1 ; # nombre de sommets
00056     
$sommets
= array() ; # tableau des noms de sommets
00057     
$sommetsi
= array() ; # tableau inverse des noms de sommets
00058     
$listes
= array() ; # tableau des listes d'adjacence
00059     
$matadj
= array() ; # matrice d'adjacence
00060     
00061     
$ladj
= file_get_contents($nomf) ;
00062     
00063     
# on découpe suivant \n et on passe en revue les lignes
00064     
00065     
$tladj
= preg_split("/\n/",$ladj) ;
00066     
00067     if (
$dbg
==1) { print_r($tladj) ; } ;
00068     
00069     
$nbl
= 0 ;
00070     foreach (
$tladj
as $nums=>$liste) {
00071     
00072      if (
$dbg
==1) { echo " $nums => $liste \n" ; } ;
00073     
$liste
= trim($liste) ;
00074     
$nbl++ ;
00075      if (
$dbg
==1) { echo "\n liste numéro $nbl : $liste\n "; } ;
00076     
00077     
# traitement de la liste si non vide
00078     
00079     
if (
strlen($liste)>0) {
00080     
00081     
# on convertit la liste en tableau
00082     
00083     
$tdm
= preg_split("/\s+/",$liste) ;
00084     
$noms
= $tdm[0] ;
00085     
00086     
# si le premier sommet (l'origine) n'est pas connu, on l'ajoute
00087     
00088     
if (!isset(
$sommetsi[ $noms])) {
00089     
$nbsom++ ;
00090     
$sommets
[$nbsom] = $tdm[0] ;
00091      echo
" sommet numéro "
.sprintf("%2d",1+$nbsom)." : ".$sommets[$nbsom]."\n" ;
00092     
$sommetsi
[ $tdm[0] ] = $nbsom ;
00093     
$nums
= $nbsom ;
00094     
$listes
[$nums] = array_slice($tdm,1,count($tdm)-1) ;
00095      if (
$dbg
==1) {
00096      echo
" on initialise la liste de
$noms en position $nums avec : ".implode(" ",$listes[$nums])."\n" ;
00097      }
# fin si debug
00098     
} else {
00099     
# sinon, on récupère son numéro
00100     
$nums
= $sommetsi[ $noms ] ;
00101      if (
$dbg
==1) {
00102      echo
" sommet
$noms déjà vu, numéro ".sprintf("%2d",1+$nums)."\n" ;
00103      echo
" sa liste était "
.implode(" ",$listes[$nums])."\n" ;
00104      echo
" et il faut ajouter "
.implode(" ",array_slice($tdm,1,count($tdm)-1))."\n" ;
00105      }
# fin si debug
00106     
$listes
[$nums] = array_merge($listes[$nums],array_slice($tdm,1,count($tdm)-1)) ;
00107      if (
$dbg
==1) {
00108      echo
" sa liste est donc "
.implode(" ",$listes[$nums])."\n" ;
00109      }
# fin si debug
00110     
} # fin si
00111     
00112      # on traite maintenant la liste courante des sommets (destination)
00113     
00114     
foreach (
$listes[$nums] as $num => $sommet) {
00115     
00116     
# on ajoute un sommet non vu
00117     
if (!isset(
$sommetsi[ $sommet ])) {
00118     
$nbsom++ ;
00119     
$sommets
[$nbsom] = $sommet ;
00120     
$sommetsi
[$sommet] = $nbsom ;
00121      if (
$dbg
==1) {
00122      echo
" sommet numéro "
.sprintf("%2d",1+$nbsom)." : ".$sommets[$nbsom]."\n" ;
00123      }
# fin si debug
00124     
$listes
[$nbsom] = array() ;
00125      } ;
# fin si
00126     
00127     
} # fin pour chaque sommet
00128     
00129     
} # fin si
00130     
00131     
} # fin pour chaque liste
00132     
00133     
if (
$dbg==1) { echo " voici les listes " ; print_r($listes) ; } ;
00134     
00135     
###################################################################################
00136     
00137     # initialisation de la matrice d'adjacence
00138     
00139     ###################################################################################
00140     
00141     # plus astucieux avec une ligne-tableau recopiée ?
00142     
00143     
for (
$isom=0;$isom<=$nbsom;$isom++) {
00144     
$matadj
[$isom] = array() ;
00145      for (
$jsom
=0;$jsom<=$nbsom;$jsom++) {
00146     
$matadj
[$isom][$jsom] = 0 ;
00147      }
# fin pour jsom
00148     
} # fin pour isom
00149     
00150     ###################################################################################
00151     
00152     # remplissage de la matrice d'adjacence
00153     
00154     ###################################################################################
00155     
00156     
for (
$isom=0;$isom<=$nbsom;$isom++) {
00157     
$liste
= $listes[$isom] ;
00158      if (
$dbg
==1) { echo " sommet $isom : liste => \n" ; print_r($liste) ; } ;
00159      foreach (
$liste
as $sommet) {
00160      if (
$dbg
==1) { echo " $isom : $sommet \n" ; } ;
00161     
$jsom
= $sommetsi[ $sommet ] ;
00162     
$matadj
[ $isom][ $jsom ] = 1 ;
00163      }
# fin pour chaque liste
00164     
} # fin pour isom
00165     
00166     
echo
"\nVoici la matrice d'adjacence associée au fichier $nomf :\n\n" ;
00167     
00168     echo
"num nom " ;
00169     for (
$isom
=0;$isom<=$nbsom;$isom++) {
00170      echo
sprintf
("%2d ",1+$isom) ;
00171     }
# fin pour isom
00172     
echo
"\n" ;
00173     
00174     for (
$isom
=0;$isom<=$nbsom;$isom++) {
00175      echo
sprintf
(" %2d ",1+$isom) ;
00176      echo
substr
($sommets[$isom]." ",0,7) ;
00177      for (
$jsom
=0;$jsom<=$nbsom;$jsom++) {
00178      echo
" "
.$matadj[$isom][$jsom]." " ;
00179      }
# fin pour jsom
00180     
echo
"\n" ;
00181     }
# fin pour isom
00182     
echo
"\n" ;
00183     
00184     
###################################################################################
00185     
00186     # création du fichier DOT
00187     
00188     ###################################################################################
00189     
00190     
$ftmp
= "dot_tmp.gv.txt" ;
00191     
$fh
= fopen($ftmp,"w") or die(" impossible d'écrire le fichier $ftmp. Stop\n.") ;
00192     
fputs
($fh,"digraph matrice {\n") ;
00193     
00194     for (
$isom
=0;$isom<=$nbsom;$isom++) {
00195     
$liste
= $listes[$isom] ;
00196      foreach (
$liste
as $sommet) {
00197     
$lig
= " ".utf8_encode($sommets[$isom])." -> ".utf8_encode($sommet)." ;\n" ;
00198     
fputs
($fh,$lig) ;
00199      if (
$dbg
==1) { echo $lig ; } ;
00200      }
# fin pour chaque sommet
00201     
} # fin pour isom
00202     
00203     
fputs
($fh,"}\n") ;
00204     
fclose
($fh) ;
00205     
00206     
$fpng
= "dot_tmp.gv.png" ;
00207     
00208     
###################################################################################
00209     
00210     # exécution du fichier DOT
00211     
00212     ###################################################################################
00213     
00214     
if (
$dbg==1) { system("cat $ftmp") ; } ;
00215     
$cmd
= " dot -T png $ftmp -o $fpng " ;
00216     if (
$dbg
==1) { echo "\n $cmd \n" ; } ;
00217     
system
($cmd) ;
00218     
00219     
00220     
###################################################################################
00221     
00222     
echo
"\n\n -- fin normale de matadj.php\n\n" ;
00223     
?>

Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.

 

 

retour gH    Retour à la page principale de   (gH)