Cod sursa(job #1883657)

Utilizator SanduStefaniaSandu Stefania Iulia SanduStefania Data 18 februarie 2017 09:52:38
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n,m,e,ap[10000],ok,nr=0,rght[10000],lft[10000],i;
vector <int> gr[10000];
vector <int> ::iterator it;
void dload()
{
    int i,x,y;
    f>>n>>m>>e;
    for (i=1;i<=e;i++)f>>x>>y,gr[x].push_back(y);
}
void uload()
{
    int i;
    for (i=1;i<=n;i++) if (lft[i]>0) nr++;
    g<<nr<<'\n';
    for (i=1;i<=n;i++) if (lft[i]>0) g<<i<<" "<<lft[i]<<'\n';
}
int cupleaza(int x)
{
    if (ap[x]) return 0;
    ap[x]++;
    for (auto &it: gr[x])
        if (!rght[it])
            {
                lft[x]=it;
                rght[it]=x;
                return 1;
            }

    for (auto &it: gr[x])
        if (cupleaza(rght[it]))
            {
                lft[x]=it;
                rght[it]=x;
                return 1;
            }
    return 0;
}
int main()
{
    dload();
    ok=1;
    while (ok)
    {
        ok=0;
        memset(ap,0,sizeof(ap));
        for (i=1;i<=n;i++) if (!lft[i]) ok+=cupleaza(i);
    }
    uload();
    return 0;
}