par
tesmet » 04 janv. 2015, 22:58
Salut
Un exemple des données sources et d'un résultat attendu pourraient simplifier la compréhension, car le code php n'est pas du tout parlant et l'algorithme ne semble pas correspondre aux données présentées.
$resolution = array(
[0] => Array ( [0] => 0 [1] => 1 [2] => 2 )
[1] => Array ( [0] => 1 [1] => 1 [2] => 7 )
[2] => Array ( [0] => 2 [1] => 1 [2] => 12 )
[3] => Array ( [0] => 3 [1] => 0 [3] => 18 )
// Array ( [0] => point de départ de l'arc [1] => point d'arrivé de l'arc [2] => valeur de l'arc, ce dernier point étant inutile pour une recherche en largeur )
)
Code : Tout sélectionner
ParcoursLargeur(Sommet s):
{
f = CreerFile();
f.enfiler(s);
marquer(s);
TANT-QUE NON f.vide() FAIRE
s = f.defiler();
afficher(s);
POUR TOUT voisin de s FAIRE
SI voisin non marqué FAIRE
f.enfiler(voisin);
marquer(voisin);
FIN SI
FIN POUR TOUT
FIN TANT QUE
}
En supposant que voisin est synonyme de "numéro du sommet d'arrivé de l'arc", alors une implémentation possible de l'algorithme adapté à tes données pourrait être.
<?php
$resolution = array(array(0, 1, 2), array(1, 1, 7), array(2, 1, 12), array(3, 1, 18));
$sommets = array();
$c = 2; // d'où vient $c ?
$f[] = $resolution[$c][0];
$marquer[$resolution[$c][0]] = true;
while(count($f)) {
$s = array_shift($f);
$sommets[] = $s; // pour afficher les sommets uniquement
// extraires les voisins ([1] => numéro du sommet d'arrivé de l'arc?) PHP 5.3+
$voisins = array_filter($resolution, function($tableau) use ($s) {return $tableau[0] == $s;});
foreach($voisins as $voisin) {
if(!isset($marquer[$voisin[1]])) {
$f[] = $voisin[1];
$marquer[$voisin[1]] = true;
}
}
}
var_dump($sommets);
?>
Si c'est dans la bonne direction et que la mémoire n'est pas un problème, alors une pré-indexation des "voisins" pourrait simplifier le code et accélérer l'exécution.
<?php
$resolution = array(array(0, 1, 2), array(1, 1, 7), array(2, 1, 12), array(3, 1, 18));
$sommets = array();
// pré-indexation des voisins ([1] => numéro du sommet d'arrivé de l'arc?)
$voisins = array();
foreach($resolution as $r) $voisins[$r[0]][] = $r[1];
$c = 2; // d'où vient $c ?
$f[] = $resolution[$c][0];
$marquer[$resolution[$c][0]] = true;
while(count($f)) {
$s = array_shift($f);
$sommets[] = $s; // pour afficher les sommets uniquement
foreach($voisins[$s] as $voisin) {
if(!isset($marquer[$voisin])) {
$f[] = $voisin;
$marquer[$voisin] = true;
}
}
}
var_dump($sommets);
?>
Bonne chance.
Salut
Un exemple des données sources et d'un résultat attendu pourraient simplifier la compréhension, car le code php n'est pas du tout parlant et l'algorithme ne semble pas correspondre aux données présentées.
[quote="DroZo"]
[php]$resolution = array(
[0] => Array ( [0] => 0 [1] => 1 [2] => 2 )
[1] => Array ( [0] => 1 [1] => 1 [2] => 7 )
[2] => Array ( [0] => 2 [1] => 1 [2] => 12 )
[3] => Array ( [0] => 3 [1] => 0 [3] => 18 )
// Array ( [0] => point de départ de l'arc [1] => point d'arrivé de l'arc [2] => valeur de l'arc, ce dernier point étant inutile pour une recherche en largeur )
)[/php]
[code]ParcoursLargeur(Sommet s):
{
f = CreerFile();
f.enfiler(s);
marquer(s);
TANT-QUE NON f.vide() FAIRE
s = f.defiler();
afficher(s);
POUR TOUT voisin de s FAIRE
SI voisin non marqué FAIRE
f.enfiler(voisin);
marquer(voisin);
FIN SI
FIN POUR TOUT
FIN TANT QUE
}[/code][/quote]
En supposant que voisin est synonyme de "numéro du sommet d'arrivé de l'arc", alors une implémentation possible de l'algorithme adapté à tes données pourrait être.
[php]<?php
$resolution = array(array(0, 1, 2), array(1, 1, 7), array(2, 1, 12), array(3, 1, 18));
$sommets = array();
$c = 2; // d'où vient $c ?
$f[] = $resolution[$c][0];
$marquer[$resolution[$c][0]] = true;
while(count($f)) {
$s = array_shift($f);
$sommets[] = $s; // pour afficher les sommets uniquement
// extraires les voisins ([1] => numéro du sommet d'arrivé de l'arc?) PHP 5.3+
$voisins = array_filter($resolution, function($tableau) use ($s) {return $tableau[0] == $s;});
foreach($voisins as $voisin) {
if(!isset($marquer[$voisin[1]])) {
$f[] = $voisin[1];
$marquer[$voisin[1]] = true;
}
}
}
var_dump($sommets);
?>[/php]
Si c'est dans la bonne direction et que la mémoire n'est pas un problème, alors une pré-indexation des "voisins" pourrait simplifier le code et accélérer l'exécution.
[php]<?php
$resolution = array(array(0, 1, 2), array(1, 1, 7), array(2, 1, 12), array(3, 1, 18));
$sommets = array();
// pré-indexation des voisins ([1] => numéro du sommet d'arrivé de l'arc?)
$voisins = array();
foreach($resolution as $r) $voisins[$r[0]][] = $r[1];
$c = 2; // d'où vient $c ?
$f[] = $resolution[$c][0];
$marquer[$resolution[$c][0]] = true;
while(count($f)) {
$s = array_shift($f);
$sommets[] = $s; // pour afficher les sommets uniquement
foreach($voisins[$s] as $voisin) {
if(!isset($marquer[$voisin])) {
$f[] = $voisin;
$marquer[$voisin] = true;
}
}
}
var_dump($sommets);
?>[/php]
Bonne chance.