Cod sursa(job #2866432)

Utilizator alexmorosanuMorosanu Alexandru alexmorosanu Data 9 martie 2022 18:18:05
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector <int> v[10011];
bool fost[10011];
int st[10011],dr[10011],nr;
bool hopcroft(int k)
{
    if(fost[k]==1)
        return 0;
    fost[k]=1;
    for(int i=0;i<v[k].size();i++)
        if(dr[v[k][i]]==0)
    {
        st[k]=v[k][i];
        dr[v[k][i]]=k;
        return 1;
    }
    for(int i=0;i<v[k].size();i++)
        if(hopcroft(dr[v[k][i]])==1)
    {
        st[k]=v[k][i];
        dr[v[k][i]]=k;
        return 1;
    }
    return 0;
}
int n,m,p,x,y,i,schimb;
int main()
{
    f>>n>>m>>p;
    for(i=1;i<=p;i++)
    {
        f>>x>>y;
        v[x].push_back(y);
    }
    schimb=1;
    while(schimb)
    {
        schimb=0;
        memset(fost,0,sizeof(fost));
        for(i=1;i<=n;i++)
            if(st[i]==0)
            schimb=schimb|hopcroft(i);
    }
    for(i=1;i<=n;i++)
        if(st[i]!=0)
        nr++;
    g<<nr<<'\n';
    for(i=1;i<=n;i++)
        if(st[i]!=0)
        g<<i<<" "<<st[i]<<'\n';
    return 0;
}