Sunteți pe pagina 1din 6

Graful bipartit

Definitie: Se numeste graf bipartit, un graf G=(X,U) cu proprietatea ca exista doua multimi A si B incluse n X, astfel nct: A B = , A U B = X,

orice muchie (arc) are o extremitate in multimea A , iar cealalta in B

1)Sa se scrie un program care verifica daca un graf este bipartit si in caz afirmativ sa se afiseze multimile A si B .

In ex din figura o solutie este: A: 1, 4, 5 B: 2, 3, 6, 7, O solutie de rezolvare porneste de la parcurgerea pe rand in latime o grafului incepand de la primul nod. Se obtine o prima coada: c[1, 3, 7, 4, 2] apoi coada c[5, 6, 8]. Pentru prima coada se parcurg elementele din c si se marcheaza s[c[k]] si s[c[j]] cu valori diferite (1 si -1 ) daca a[c[k]][c[j]]=1. Daca nu este posibil inseamna ca graful nu este bipartit. La fel se procedeaza si cu cea de a doua coada etc. Se parcurge 1 care se marcheaza cu 1. Nodurile adiacente 3 si 7 se marcheaza cu -1. Apoi 3 si care este adiacent cu 4. Deci se marcheaza 4 cu 1. Pentru nodul 7 nu mai sunt noduri adiacente (doar 1 care a fost deja parcurs). Se ajunge la nodul 4 care este vecin cu 2 . Se marcheaza 2 cu -1 La fel se procedeaza cu coada c[5,6, 8]. Se marcheaza 5 cu 1 si 6 si 8 cu -1.

#include<fstream.h> #include<conio.h> #include<iostream.h> int a[20][20],c[20],viz[20]; int s[20]; int n,m,prim,ultim,varf; void latime() // {int k; while(prim<=ultim) {varf=c[prim]; for(k=1;k<=n;k++) if(a[varf][k]==1&&viz[k]==0) {ultim++; c[ultim]=k; viz[k]=1;} prim++; } } int main() { int x,y,i; ifstream f("D:\\sin.txt"); f>>n>>m;

for(i=1;i<=m;i++) {f>>x>>y; a[x][y]=a[y][x]=1; } cout<<"matricea de adiacenta "<<endl; for(i=1;i<=n;i++) {for(int j=1;j<=n;j++) cout<<a[i][j]<<" "; cout<<endl; } int nd,k; int ok=1; for(nd=1;nd<=n;nd++) if(viz[nd]==0) {for(k=1;k<=n;k++) {c[k]=0; viz[nd]=0; } prim=ultim=1; viz[nd]=1; c[prim]=nd; latime(); cout<<endl;

for(int k=1;k<=ultim-1;k++) for(int j=k+1;j<=ultim;j++) if(a[c[k]][c[j]]==1) if(s[c[k]]==0&&s[c[j]]==0) {s[c[k]]=1;s[c[j]]=-1;} else if(s[c[k]]!=0&&s[c[j]]==0) s[c[j]]=-1*s[c[k]]; else if(s[c[k]]==s[c[j]]&&s[c[k]]!=0&&s[c[j]]!=0) ok=0; } cout<<endl; if(ok==0) cout<<"nu este bipartit"; else { cout<<"este bipartit\n"; cout<<"elementele nultimiilor"<<endl; for(i=1;i<=n;i++) if(s[i]==1) cout<<i<<" "; cout<<endl;

for(i=1;i<=n;i++) if(s[i]==-1) cout<<i<<" "; } }

S-ar putea să vă placă și