Cod sursa(job #2642455)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 15 august 2020 13:28:15
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <algorithm>
using namespace std;
int n,m,q,i,ok,nr,ap[100005],st[100005],dr[100005];
vector <int> v[100005];
bool pot(int x)
{
    if(ap[x]) return 0;
    int y=0;
    ap[x]=1;
    for(int ii=1; ii<=v[x][0]; ii++)
    {
        y=v[x][ii];
        if(st[y]==0)
        {
            dr[x]=y;
            st[y]=x;
            return 1;
        }
    }
    for(int ii=1; ii<=v[x][0]; ii++)
    {
        y=v[x][ii];
        if(pot(st[y]))
        {
            dr[x]=y;
            st[y]=x;
            return 1;
        }
    }
    return 0;
}
int main()
{
    ifstream f("cuplaj.in");
    ofstream g("cuplaj.out");
    f>>n>>m>>q;
    for(i=1; i<=n; i++) v[i].push_back(0);
    for(i=1; i<=q; i++)
    {
        int x,y;
        f>>x>>y;
        v[x][0]++;
        v[x].push_back(y);
    }
    ok=1;
    while(ok)
    {
        ok=0;
        for(i=1; i<=n; i++) ap[i]=0;
        for(i=1; i<=n; i++)
            if(dr[i]==0&&pot(i)==1)
            {
                ok=1;
                nr++;
            }
    }
    g<<nr<<'\n';
    for(i=1; i<=n; i++)
    {
        if(dr[i]) g<<i<<" "<<dr[i]<<'\n';
    }
    return 0;
}