Cod sursa(job #807066)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 3 noiembrie 2012 23:54:25
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <cstring>
using namespace std;
typedef struct celula{
            int nod;
             celula *next;
            }*lista;
lista graf[10001],v;
int n,m,e,l[10001],r[10001],viz[10001];

bool cupleaza(int sursa) {
      lista p;
       if(viz[sursa]) return(false);
      viz[sursa]=1;
       for(p=graf[sursa];p; p=p->next)
             if(!r[p->nod]){
                l[sursa]=p->nod;
                 r[p->nod]=sursa;
                return true;
               }
       for(p=graf[sursa];p; p=p->next)
             if(cupleaza(r[p->nod])) {
                          l[sursa]=p->nod;
                           r[p->nod]=sursa;
                          return(true);
                          }
       return(false);
}
int main(void){
   int i,x,y,sol=0;
   bool ok=true;
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
   fin>>n>>m>>e;
   for(i=1; i<=e; i++) {
    fin>>x>>y;
    v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v;
    }
   while (ok) {
      ok=false;
        memset(viz,0,sizeof(viz));
       for(i=1; i<=n; ++i) if(!l[i]) ok=ok|cupleaza(i);
    }
  for(i=1; i<=n; ++i) if(l[i]) ++sol;
   fout<<sol<<"\n";
  for(i=1; i<=n; ++i) if (l[i])fout<<i<<" "<<l[i]<<"\n";
return 0;
}