Salut,
La programmation est quelque chose de très abstrait. L'implémentation de l'algorithme que tu as donné peut être réalisée de différentes façons et elle est étroitement liée aux
structures de données choisies. Par exemple X1 peut être un tableau ou une liste liée ..etc (idem pour X2).
Si j'étais à ta place j'utiliserais les éléments suivants:
- Un tableau de
2 lignes et
a colonnes pour la liste des arcs [i](si arcs[i][1] = x et arcs
[2] = y cela veut dire qu'il existe un arc entre x et y).
- Un tableau de
n éléments pour les composantes fortement connexes (l'indice du tableau étant le noeud et le contenu de la case est la cfc du noeud, autrement dit: si noeuds[x] = c alors x appartient à cfc n° c). Le tableau est initialisé a 0.
- Une variable
c initialisé à 1pour compter les cfc.
- Une fonction booléenne pour déterminer s'il existe un arc entre deux noeuds. La fonction va chercher dans le tableau arcs, en voici un exemple en pseudo C:
1 2 3 4 5 6 7 8 9 10
|
boolean existeUnArcEntre(x , y){
for ( i = 1; i <= a; i++){
// pour chaque arc du tableau
if (arcs[i][1] == x AND arcs[i][2] == y) OR (arcs[i][1] == y AND arcs[i][2] == x)
return true;
}
return false;
} |
- Une fonction récursive (qui s'appelle à elle même) pour parcourir tous les noueuds:
1 2 3 4 5 6 7 8 9 10 11
| parcourir(x){
ccf[x] = c;
// pour tout noeud différent de x
pour y = 1 jusqu'à n faire:
// si y n'a pas été visité et il existe un arc entre x et y:
if ccf[y] == 0 AND (existeUnArcEntre(x, y) == true
parcourir(y);
c++; // c := c + 1 si tu es trop Pascal.
} |
- Dans le programme principal, parés avoir lu la liste des arcs et initialisé les variables, choisir le premier noeud et lancer la procédure parcourir:
1 2
| parcourir(x); // appelée une seul fois dans le programme principal
écrire("le nombre de cfc est", c - 1); |
Bon code.
Partager