Cod sursa(job #1199330)

Utilizator DjokValeriu Motroi Djok Data 18 iunie 2014 20:21:33
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<algorithm>
#include<cstring>
using namespace std;

typedef struct lnod {
       int info;
       lnod *next;        
}*nod;

int l[10005],r[10005],i,j,n,m,e,x,y,rs;
bool u=1,viz[10005];
nod lda[10005];

void add(int x,nod y) {
    nod p=new lnod;
    p->info=x;
    p->next=y;
    y=p;     
}

bool cuplaj(int x) {
   nod p;
   if(viz[x]==1) return 0;
   viz[x]=1;
    
   for(p=lda[x];p;p=p->next)
   if(r[p->info]==0) {
                       l[x]=p->info;
                       r[p->info]=x; 
                       return 1;
                     }
   for(p=lda[x];p;p=p->next)
   if(cuplaj(r[p->info])==1) {
                               l[x]=p->info;
                               r[p->info]=x;
                               return 1; 
                             }                   
 return 0;                     
}

int main()
{
  ifstream cin("cuplaj.in");
  ofstream cout("cuplaj.out");  
  
  cin>>n>>m>>e;
  while(e--)
  {
    cin>>x>>y;         
    add(y,lda[x]);
  }
  
  while(u==1)
  {
    u=0;
    memset(viz,0,sizeof(viz));
    for(i=1;i<=n;i++)
    if(l[i]==0) u=u|cuplaj(i);  
  }
  
  for(i=1;i<=n;i++) if(l[i]!=0) ++rs;
  
  cout<<rs<<'\n';
  
  for(i=1;i<=n;i++) if(l[i]!=0) cout<<i<<' '<<l[i]<<'\n';
    
 return 0;   
}