Cod sursa(job #2343046)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 13 februarie 2019 17:23:32
Problema Cuplaj maxim in graf bipartit Scor 28
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>
#define Dim 10006
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int N,M,E,a,b,ans;
int lefti[Dim],righti[Dim];
bool viz[Dim],done=1;

vector < int > V[Dim];

bool Cuplaj(int nod)
{
    if(viz[nod]) return 0;
    viz[nod]=1;
    for(unsigned int i=0;i<V[nod].size();i++)
    {
        int vecin=V[nod][i];
        if(righti[vecin]==0)
        {
            righti[vecin]=nod;
            lefti[nod]=vecin;
            return 1;
        }
    }
    for(unsigned int i=0;i<V[nod].size();i++)
    {
        int vecin=V[nod][i];
        if(Cuplaj(vecin))
        {
            righti[vecin]=nod;
            lefti[nod]=vecin;
            return 1;
        }
    }
    return 0;
}

int main()
{
    f>>N>>M>>E;
    for(int i=1;i<=E;i++)
    {
        f>>a>>b;
        V[a].push_back(b);
    }
    while(done)
    {
       done=0;
       memset(viz,0,sizeof(viz));
       for(int i=1;i<=N;i++)
       if(lefti[i]==0)
       {
           bool op=Cuplaj(i);
           if(op)
           {
               done=1;
               ans++;
           }
       }
    }
    g<<ans<<'\n';
    for(int i=1;i<=N;i++)
    if(lefti[i]) g<<i<<" "<<lefti[i]<<'\n';
    return 0;
}