Pe scurt
Un graf neorientat este bipartit dacă vârfurile pot fi împărțite în două grupuri astfel încât fiecare muchie unește grupuri diferite. Lanțul 1–2–3 este bipartit cu grupurile și ; un triunghi nu este, deoarece are ciclu impar. Un turneu este un graf orientat obținut orientând exact o dată fiecare muchie a unui graf complet.
În detaliu
Un graf neorientat este bipartit dacă mulțimea vârfurilor poate fi împărțită în două submulțimi disjuncte astfel încât fiecare muchie să unească un vârf din prima cu unul din a doua; în interiorul unei submulțimi nu există muchii. Un graf este bipartit dacă și numai dacă nu are cicluri de lungime impară. Într-un graf bipartit complet , fiecare dintre cele vârfuri din prima parte este legat de fiecare dintre cele vârfuri din a doua, deci graful are muchii; are muchii. Un turneu este un graf orientat obținut dintr-un graf complet prin alegerea unui singur sens pentru fiecare muchie: între oricare două vârfuri există exact un arc.
Exemplul 1 — testul de bipartitate prin colorare. Se colorează un vârf cu culoarea 1, vecinii lui cu 2, vecinii acestora cu 1 și așa mai departe, folosind o coadă. Dacă o muchie unește două vârfuri de aceeași culoare, graful nu este bipartit:
#include <iostream>
#include <queue>
using namespace std;
int main() {
int n, m, a[11][11] = {}, cul[11] = {};
cin >> n >> m;
for (int i = 0; i < m; ++i) {
int x, y;
cin >> x >> y;
a[x][y] = a[y][x] = 1;
}
bool bip = true;
for (int s = 1; s <= n; ++s) {
if (cul[s]) continue;
cul[s] = 1;
queue<int> q;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v = 1; v <= n; ++v)
if (a[u][v]) {
if (!cul[v]) { cul[v] = 3 - cul[u]; q.push(v); }
else if (cul[v] == cul[u]) bip = false;
}
}
}
cout << (bip ? "bipartit" : "nu");
if (bip) {
cout << "\n";
for (int i = 1; i <= n; ++i) cout << cul[i] << " ";
}
}
Pentru 4 4 cu muchiile , , , se afișează bipartit, apoi 1 2 1 2: culoarea 1 are vârfurile 1 și 3, iar culoarea 2 are vârfurile 2 și 4. Dacă se adaugă (4 5), muchia unește două vârfuri de culoarea 1 și apare ciclul impar 1–2–3–1, deci se afișează nu. Un triunghi (3 3) nu este bipartit, iar un lanț este mereu bipartit. Parcurgerea se repetă din fiecare vârf necolorat, pentru a acoperi toate componentele. Timpul este cu matrice și cu liste de adiacență.
Exemplul 2 — turneul. Pentru vârfuri, un turneu are arce, iar pentru fiecare vârf grad_intern + grad_extern = n-1. Turneul cu 4 vârfuri și arcele , , , , , are 6 arce. Programul verifică, pentru fiecare pereche, că există exact un sens, și afișează gradele externe:
#include <iostream>
using namespace std;
int main() {
int n = 4, a[5][5] = {};
a[1][2] = a[1][3] = a[1][4] = a[2][3] = a[3][4] = a[4][2] = 1;
bool turneu = true;
for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j)
if (a[i][j] + a[j][i] != 1) turneu = false;
cout << turneu << "\n";
for (int i = 1; i <= n; ++i) {
int g = 0;
for (int j = 1; j <= n; ++j) g += a[i][j];
cout << g << " ";
}
}
Se afișează 1 (este turneu), apoi 3 1 1 1. Suma gradelor externe este . Circuitul arată că un turneu poate avea circuite. Turneul ciclic , , are, pentru fiecare vârf, un arc de intrare și unul de ieșire.
Exemplul 3 — în formatul examenului. Care este numărul maxim de muchii al unui graf bipartit simplu cu 7 vârfuri?
- a) 10
- b) 12
- c) 14
- d) 21
Răspunsul corect este b). Un graf bipartit are cele mai multe muchii când este complet între cele două părți, cu vârfuri și muchii. Produsele posibile sunt , și , deci maximul este 12, pentru partea de 3 și partea de 4 vârfuri. Varianta a) corespunde părților de 2 și 5, iar c) nu corespunde niciunei împărțiri. Varianta d) este numărul muchiilor grafului complet cu 7 vârfuri, care nu este bipartit.
Greșeli frecvente
- Greșit: un triunghi este bipartit dacă punem două vârfuri în același grup.Corect: muchia dintre ele ar încălca definiția.
- Greșit: într-un turneu apar ambele sensuri pentru fiecare pereche.Corect: apare exact unul.
- Greșit: are cinci muchii, câte vârfuri are.Corect: are șase muchii.
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI intensiv; rocnee.eu
Documente consultate
- Programa școlară de informatică intensiv, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE, p. 4–5; rocnee.eu
- University of Toronto, CSC111 Tutorial 8, „Bipartite graphs”, teach.cs.toronto.edu/~csc111h/winter/tutorials/08-graphs-more/; Clark University, „Directed Graphs: Tournament Graphs”, cs.clarku.edu/~cs122/class/directed-graphs/
Desene: Redactare proprie (desen original)
