Apprentissage interactif de la théorie des graphes
Apprentissage interactif de la théorie des graphes
Guest User
Using app without sign in
Vérificateur de graphe biparti
Détermine si le graphe peut être coloré avec 2 couleurs
Sélectionnez un algorithme et générez les étapes pour commencer la visualisation
Un graphe est biparti quand ses sommets peuvent être répartis en deux groupes, chaque arête traversant entre les groupes, jamais à l'intérieur d'un seul. Vérifier la biparticité équivaut à tester si le graphe peut être coloré avec deux couleurs, ou s'il ne contient aucun cycle de longueur impaire.
Un parcours BFS ou DFS colore le graphe avec deux couleurs à la volée : colorer le sommet de départ, puis donner à chaque voisin découvert la couleur opposée. Si une arête relie un jour deux sommets de même couleur, un cycle impair existe et le graphe n'est pas biparti. Chaque composante doit être vérifiée. Le test s'exécute en O(V + E).
La structure bipartie sous-tend les problèmes de couplage : affecter des élèves à des écoles, des tâches à des machines et des passagers à des conducteurs. Les systèmes de recommandation modélisent utilisateurs et articles comme les deux côtés d'un graphe biparti. La caractérisation par cycle impair est un échauffement d'entretien fréquent menant aux sujets de couplage maximal.
Un graphe est biparti exactement lorsqu'il peut être colorié avec deux couleurs. Le test est donc un parcours qui colorie chaque sommet à l'opposé de son parent et guette une collision.
estBiparti(graphe):
couleur = {} pour tous les sommets
pour chaque sommet s sans couleur: // chaque composante
couleur[s] = 0
file = [s]
tant que la file est non vide:
u = file.retirer()
pour chaque voisin v de u:
si v n a pas de couleur:
couleur[v] = 1 - couleur[u]
file.ajouter(v)
sinon si couleur[v] == couleur[u]:
renvoyer faux // cycle impair
renvoyer vraiLa collision n'est pas un signal d'échec arbitraire, c'est une preuve. Si deux sommets adjacents reçoivent la même couleur, les chemins de l'arbre depuis chacun d'eux jusqu'à leur ancêtre commun, plus l'arête qui les relie, forment un cycle de longueur impaire. Les graphes bipartis sont exactement les graphes sans cycle impair, si bien que l'arête en conflit constitue un certificat que tu peux renvoyer à l'appelant.
Colorie un cycle de quatre sommets avec deux couleurs, puis ajoute une corde et observe le même parcours le rejeter.
Graphe d'exemple: D'abord un cycle de 4: A-B, B-C, C-D, D-A. Ensuite le même graphe avec la corde A-C ajoutée.
Le cycle de 4 est biparti avec les parties {A, C} et {B, D}; l'ajout de la corde A-C le rend non biparti, détecté sur l'arête B-C. Note la règle générale ainsi illustrée: tout cycle pair est biparti et tout cycle impair ne l'est pas, la seule longueur du cycle tranche donc. Note aussi que le conflit a été signalé sur l'arête B-C et non sur la corde elle-même, ce qui est normal, car l'algorithme signale l'endroit où la contradiction apparaît en premier, pas celui que tu tiendrais pour responsable.
Temps: O(V + E) · Espace: O(V)
Il s'agit d'un unique BFS ou DFS avec une comparaison par arête, le coût est donc exactement celui d'un parcours. Chaque sommet est colorié une fois et chaque arête inspectée une fois depuis chaque extrémité. L'espace tient à une couleur par sommet plus la file ou la pile de récursion, les deux en O(V). La boucle sur tous les sommets n'ajoute rien asymptotiquement et c'est elle qui fait fonctionner les graphes non connexes. Il n'existe pas d'approche plus rapide, car décider la bipartition impose de regarder chaque arête: une seule arête non examinée pourrait être celle qui crée un cycle impair.
La bipartition est le plus souvent une condition préalable et non un but. Ce que tu fais ensuite dépend de la raison pour laquelle tu as posé la question.
| Alternative | À préférer quand | Coût |
|---|---|---|
| Hopcroft-Karp | Le graphe est biparti et tu veux maintenant un couplage maximal entre les deux parties. | O(E·sqrt(V)) |
| Coloration de graphes | Le graphe n'est pas biparti et tu as besoin du nombre chromatique réel, qui vaut 3 ou plus. | NP-difficile en général |
| Détection de cycle impair | Tu veux le cycle fautif lui-même, pas seulement un oui ou un non. Reconstruis-le à partir des pointeurs parents du BFS sur l'arête en conflit. | O(V + E) |
| Union-Find avec parité | Les arêtes arrivent au fil de l'eau et tu veux rejeter la première qui casse la bipartition dès son ajout. | O(E·α(V)) |
Lire l'article complet: Graph Algorithms in Coding Interviews
Algorithmes associés: Recherche en Largeur (BFS), Coloration de Graphe, Flot Maximum