Cod sursa(job #1106284)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 12 februarie 2014 18:16:19
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>
#include <bitset>
#define Nmax 10099
#define pb push_back
#define mp make_pair
#define x first
#define y second
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

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

void ReadInput()
{
     f>>N>>M>>E;
     for(int i=1;i<=E;++i)
     {
          int x,y;
          f>>x>>y,G[x].pb(y);
     }
}

bool leaga(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(leaga(dr[*it]))
          {
               st[node]=*it , dr[*it]=node;
               return 1;
          }
     return 0;
}

int main()
{
     ReadInput();
     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] && leaga(i))gata=0,++sol;
     }
     g<<sol<<'\n';
     for(int i=1;i<=N;++i)
          if(st[i])g<<i<<' '<<st[i]<<'\n';
     f.close();g.close();
     return 0;
}