Cod sursa(job #1249397)

Utilizator ion824Ion Ureche ion824 Data 26 octombrie 2014 22:42:03
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream>
#include<cstring>
#include<vector>
using namespace std;
const int NMAX = 8200;
 
vector<int> G[NMAX];
bool u[NMAX];
int l[NMAX],r[NMAX];
int f1[NMAX],f2[NMAX];
 
bool pairUp(int n){
     vector<int>::iterator it;
     if(u[n]) return 0;
     u[n]=1;
      
     for(it=G[n].begin();it!=G[n].end();++it)
       if(!r[*it])
       {
           l[n]=(*it);
           r[*it]=n;
           return 1;         
       }
     for(it=G[n].begin();it!=G[n].end();++it)
       if(pairUp(r[*it]))
       {
           l[n]=(*it);
           r[*it]=n;
           return 1;         
       }   
     return 0;
}
 
int main(){
    ifstream f("cuplaj.in");
    ofstream g("cuplaj.out");
    int N,M,Much,i,x,y;
    bool ok;
     
    f >> N >> M >> Much;
     
    for(i=1;i<=Much;++i)
    {
      f >> x >> y;
      G[x].push_back(y);                 
    }
     
    ok = 1;
    while(ok)
    {
      ok = 0;
      memset(u,0,sizeof(u));
      for(i=1;i<=N;++i)
        if(!l[i]) ok |= pairUp(i);       
    }
 	int Card = 0;
    for(i=1;i<=N;++i) Card += (l[i] > 0);
    g << Card << '\n';
    for(i=1;i<=N;++i)
      if(l[i] > 0) g << i << ' ' << l[i] << '\n';
     
 return 0;   
}