Se dă lista muchiilor unui graf neorientat cu n
vârfuri, etichetate de la 1
la n
, precum si o mulțime A
de vârfuri ale grafului. Considerăm mulțimea B
formată din vărfurile grafului care nu aparțin lui A
. Să se verifice dacă graful este bipartit peste partiția formată din mulțimile A
și B
.
Date de intrare
Fişierul de intrare bipartit.in
conţine pe prima linie numerele n
și m
, reprezentând numărul de vârfuri ale grafului și numărul de muchii. Fiecare dintre următoarele m
linii conține câte o pereche de numere i j
, cu semnificația că există muchie între i
și j
. Urmează un număr k
, apoi k
numere naturale distincte cuprinse între 1
și n
, reprezentând vârfurile din A
.
Date de ieşire
Fişierul de ieşire bipartit.out
va conţine pe prima linie mesajul DA
, dacă graful este bipartit peste partiția formată din mulțimile A
și B
, respectiv NU
în caz contrar.
Restricţii şi precizări
1 < k < n ≤ 100
1 ≤ i , j ≤ n
- muchiile se pot repeta în fișierul de intrare
Exemplu
bipartit.in
7 6 1 4 1 6 6 5 3 2 3 5 3 7 3 4 6 3
bipartit.out
DA
#include <iostream> #include <fstream> #include <cassert> using namespace std; ifstream fin("bipartit.in"); ofstream fout("bipartit.out"); int n , a[105][105], x[105] , k; int main() { int i , j , m; fin >> n >> m; while(m > 0) { fin >> i >> j; a[i][j] = a[j][i] = 1; m --; } fin >> k; for(int i = 1 ; i <= k ;++i) { int p; fin >> p; x[p] = 1; } for(int i = 1; i <= n ; i++) for(int j = 1 ; j <= n ; ++j) if(x[i] != x[j]) if(a[i][j] != 0) a[i][j] = a[j][i] = 2; int cnt = 0; for(int i = 1 ; i < n ; ++i) for(int j = i + 1 ; j <= n ; ++j) if(a[i][j] == 1) cnt ++; for(int i = 1; i <= n ; i++){ for(int j = 1 ; j <= n ; ++j) cout << a[i][j] << " "; cout << endl; } if(cnt == 0) fout << "DA"; else fout << "NU"; return 0; }