Cod sursa(job #2983018)

Utilizator alexandrupopa11Alexandru alexandrupopa11 Data 21 februarie 2023 14:26:06
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("cuplaj.in");
ofstream out("cuplaj.out");

vector <int> v[10001];
int n,m,k,used[10001],ok = 1,gr1[10001],gr2[10001],contor;

int solve(int a)
{
    if(used[a])
        return 0;
    used[a] = 1;
    for(int i = 0;i < v[a].size();i++)
    {
        int x = v[a][i];
        if(gr2[x] == 0)
        {
            gr1[a] = x,  gr2[x] = a;
            return 1;
        }
    }

    for(int i = 0;i < v[a].size();i++)
    {
        int x = v[a][i];
        if(solve(gr2[x]))
        {
            gr1[a] = x,  gr2[x] = a;
            return 1;
        }
    }

    return 0;
}

int main()
{
    in>>n>>m>>k;
    for(int i = 1;i<=k;i++)
    {
        int a,b;
        in>>a>>b;
        v[a].push_back(b);
    }

    while(ok)
    {
        ok = 0;
        for(int i = 1;i<=max(n,m);i++)
            used[i] = 0;
        for(int i = 1;i<=n;i++)
            if(!gr1[i])
                ok += solve(i);
    }
    for(int i = 1;i<=n;i++)
        if(gr1[i])
            contor++;
    out<<contor<<"\n";
    for(int i = 1;i<=n;i++)
        if(gr1[i])
            out<<i<<" "<<gr1[i]<<"\n";

    return 0;
}