Cod sursa(job #1166532)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 3 aprilie 2014 17:33:21
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
// Cuplaj O(sqrt(N)*M) - Lanturi alternative
#include <fstream>
#include <vector>
#include <bitset>
#define Nmax 10009
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

int N,M,E,dr[Nmax],st[Nmax],x,y,sol;
vector < int > G[Nmax];
bitset < Nmax > viz;

bool Cupleaza(int node)
{
     if(viz[node])return 0;
     viz[node]=1;
     for(vector<int> :: iterator it=G[node].begin();it!=G[node].end();++it)
          if(!dr[*it])
          {
               st[node]=*it;
               dr[*it]=node;
               return 1;
          }
     for(vector<int> :: iterator it=G[node].begin();it!=G[node].end();++it)
          if(Cupleaza(dr[*it]))
          {
               st[node]=*it;
               dr[*it]=node;
               return 1;
          }
     return 0;
}

int main()
{
     f>>N>>M>>E;
     for(int i=1;i<=E;++i)
        f>>x>>y , G[x].push_back(y);
     int gata=0;
     while(!gata)
     {
          gata=1;
          for(int i=1;i<=N;++i)viz[i]=0;
          for(int i=1;i<=N;++i)
               if(!st[i] && Cupleaza(i))
                    ++sol,gata=0;
     }
     g<<sol<<'\n';
     for(int i=1;i<=N;++i)
          if(st[i])g<<i<<' '<<st[i]<<'\n';
     f.close();g.close();
     return 0;
}