Cod sursa(job #1909172)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 7 martie 2017 11:50:06
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int nmax = 10005;
int N,M,E,ans;
int st[nmax],dr[nmax];
bool viz[nmax];
vector < int > L[nmax];

inline void Read()
{
    int x,y;
    fin >> N >> M >> E;
    while(E--)
    {
        fin >> x >> y;
        L[x].push_back(y);
    }
}

inline bool Cupleaza(int nod)
{
    if(viz[nod]) return false;
    viz[nod] = true;
    for(auto it : L[nod])
    {
        if(!dr[it])
        {
            st[nod] = it;
            dr[it] = nod;
            return true;
        }
    }
    for(auto it : L[nod])
    {
        if(dr[it] && Cupleaza(dr[it]))
        {
            st[nod] = it;
            dr[it] = nod;
            return true;
        }
    }
    return false;
}

inline void Solve()
{
    int i,gata;
    gata = 0;
    while(!gata)
    {
        gata = 1;
        for(i = 1; i <= N; i++) viz[i] = false;
        for(i = 1; i <= N; i++)
            if(!st[i] && Cupleaza(i))
        {
            ans++;
            gata = 0;
        }
    }
    fout << ans << "\n";
    for(i = 1; i <= N; i++)
        if(st[i]) fout << i << " " << st[i] << "\n";
}


int main()
{
    Read();
    Solve();
    fout.close();
    return 0;
}