Cod sursa(job #2602810)

Utilizator Chirac_MateiChiriac Matei Chirac_Matei Data 17 aprilie 2020 21:32:50
Problema Cuplaj maxim in graf bipartit Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
int n,m,i,j,nleg,x,y,flux;
int viz[20005];
map <int, map<int, int>> f,maxf;
bool dfs(int poz)
{
    viz[poz]=true;

    if(poz==n+m+1)
        return true;

    for(int i=1;i<=n+m+1;i++)
    {
        if(!viz[i] && maxf[poz][i]>f[poz][i])
        {
            if(dfs(i))
            {
                f[poz][i]++;
                f[i][poz]--;
                return true;
            }
        }
    }

    return false;
}
int main()
{
    fin>>n>>m>>nleg;
    for(i=1;i<=n;i++)
        maxf[0][i]=1;
    for(i=1;i<=m;i++)
        maxf[n+i][n+m+1]=1;

    for(i=1;i<=nleg;i++)
    {
        fin>>x>>y;
        maxf[x][n+y]=1;
    }

    while(true)
    {
        for(i=1;i<=n+m+1;i++)
            viz[i]=false;

        bool ans = dfs(0);

        if(!ans)
            break;

        flux++;
    }

    fout<<flux<<'\n';

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            if(f[i][n+j]==1)
            {
                fout<<i<<' '<<j<<'\n';
                break;
            }
        }
    }
    return 0;
}