web-dev-qa-db-fra.com

Comment savoir si un graphe est bipartite?

J'ai essayé de comprendre le graphique bipartite. A ma connaissance, il s’agit d’un graphe G qui peut être divisé en deux sous-graphes U et V. Ainsi, l’intersection de U et V est un ensemble nul et l’union est le graphe G . ne pas utiliser BFS. Cependant, il n’est pas clair pour moi que nous pouvons trouver cela avec BFS.

Disons que nous avons un graphique défini ci-dessous.

a:e,f
b:e
c:e,f,h
d:g,h
e:a,b,c
f:a,c,g
g:f,d
h:c,d

Ce dont j'ai besoin ici, c'est d'expliquer étape par étape comment ce graphique est bipartite ou n'utilise pas BFS.

14
user2738777

Voici une solution Prolog CLP (FD). Il suffit de modéliser chaque bord du graphique en tant que variable du domaine 0..1. Puis modélisez chaque sommet comme une équation:

X #\= Y.

Puis émettre un étiquetage. Si l'étiquetage trouve une solution, vous avez terminé. Il pourrait cependant trouver plusieurs solutions. Voici une course pour votre exemple:

Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.23)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam

:- use_module(library(clpfd)).
problem(L) :- L=[A,B,C,D,E,F,G],
    A #\= E, A #\= F,
    B #\= E,
    C #\= E, C #\= F, C #\= H,
    D #\= G, D #\= H,
    E #\= A, E #\= B, E #\= C,
    F #\= A, F #\= C, F #\= G,
    G #\= F, G #\= D,
    H #\= C, H #\= D.

?- problem(L), L ins 0..1, label(L).
L = [0, 0, 0, 1, 1, 1, 0] ;
L = [1, 1, 1, 0, 0, 0, 1].

Fonctionne également dans Prolog GNU, Prolog SICStus, Jekejeke Minlog, etc., principalement avec tout système Prolog implémentant CLP (FD). Alternativement, vous pouvez également utiliser CLP (B) ou dif/2.

2
j4n bur53

De l'Université Carnegie Mellon:

"Rappelons qu'un graphe G = (V, E) est dit bipartite Si son ensemble de sommets V peut être partitionné en deux ensembles disjoints V1, V2 tels que toutes les arêtes de E. aient un point d'extrémité dans V1 et un point d'extrémité en V2.

(source: http://www.cs.cmu.edu/~15251/homework/hw5.pdf )

Êtes-vous sûr de devoir utiliser BFS? Déterminer si un graphique si bipartite nécessite de détecter des longueurs de cycle, et DFS est probablement meilleur pour la détection de cycle que BFS. 

Quoi qu'il en soit, un graphe est bipartite si et seulement s'il n'a pas de cycles de longueur impaire. Si vous êtes autorisé à utiliser DFS, vous pouvez utiliser DFS sur le graphique et vérifier les arrières pour détecter la présence de cycles et utiliser les horodatages DFS pour calculer la taille de chaque cycle. 

2
Xceptional

Créez un arbre bfs. S'il y a des arêtes entre les sommets du même niveau d'arbre, le graphe n'est pas bipartite, sinon il est bipartite.

1
ashu beckham

vous pouvez vous référer à ce lien comme indiqué ci-dessous
Ce code contient Vérifie si un graphe donné est bipartite ou n’utilise pas l’algorithme BFS
https://github.com/gangwar-yogendra/Graph/blob/master/BipartiteGraphUsingBFS.c

0
Yogendra Kumar

Ce qui suit est une approche BFS pour vérifier si le graphique est bipartite.

  • c = 0
  • choisissez un noeud x et définissez x.class = c
  • soit ys les noeuds obtenus par BFS
    • c = 1-c
    • pour y dans ys set y.class = c
    • si un y dans ys a un voisin z avec z.class == c alors le graphe n'est pas bipartite
    • répéter jusqu'à ce qu'il n'y ait plus de nœuds trouvés
  • le graphique est bipartite

Cela suppose que le graphique est un composant connecté unique. Si ce n'est pas le cas, il suffit de suivre cette procédure pour chaque composant.

0
mitchus