1. Oui, oui (il faut au moins trois sommets pour qu'existe un point d'articulation) non et oui.

  2. Soit donc un graphe sans point d'articulation. Soient encore deux arcs distincts ss' et tt'. On prouve l'existence d'un cycle contenant les deux arcs, par induction sur la longueur d'un chemin liant s à t (ou s à t', ou s' à t, ou s' à t').
    Réciproquement (si j'ose dire). Soit un graphe contenant un point d'articulation a. Il existe donc deux sommets distincts s et t, reliés par un chemin simple ss' ↔ … ↔ a ↔ … ↔ t' ↔ t. Il ne peut pas exister de cycle contenant à la fois les arcs, ss' et tt', car il n'existe pas de cycle contenant à la fois s et t. En effet il existerait alors un chemin de s à t ne passant pas par a.

  3. Et voilà, en partant de deux sommets différents.
    Dans les deux cas les résultats entiers du parcours sont indiqués et les points d'articulation sont grisés.

  4. Il suffit que le test lowN >= num[s] soit vrai deux fois. C'est le cas avec le graphe suivant pour le sommet numéroté 2.


  5. Vu du palmier, l'appel doFind(s,_) calcule lowpt[s], qui est le plus petit numéro de sommet dans l'ensemble { s } ∪ {  t, s* -→ t}.

    Or, soit a distinct de la racine, n un fils de a dans (X,T) (il existe an). Si lowpt[n] ≤ num[a] alors a est un point d'articulation, car il n'existe aucun arc du graphe d'origine entre un ancêtre strict de a et n qui ne passe pas par a. En effet, tous les chemins (du graphe d'origine) ne passant pas par a restent confinés au sous-arbre de racine n, puisque les éventuels arcs de retour issus d'un sommet de Tn pointent vers des ancêtres de leur origine qui sont nécessairement des sommets de Tn.

    Si lowpt[n] > num[a] alors ont peut construire un chemin ne passant pas par a à tout autre sommet du graphe, en employant au besoin un arc de retour dans le bon sens et des arcs de l'arbre dans un sens indifférent.

    Le cas de la racine est encore plus simple. Elle est un point d'articulation si et seulement si elle possède deux fils ou plus dans (X,T).

    Enfin les feuilles (de l'arbre de recouvrement) ne peuvent pas être détectées comme point d'articulation. Or, elles ne sont jamais des points d'articulation du graphe d'origine, n'étant pas même des points d'articulation de l'arbre (non-orienté).

    Le programme du poly s'abstient du test num[n] < num[s] && n !=pere ce qui n'est pas gênant, car alors la valeur de lowpt n'est pas changée. En effet dans ces deux cas on a num[n] ≥ num[s], et on sait par ailleurs lowpt[s] ≤ num[s].