Cod sursa(job #2709050)

Utilizator Marius7122FMI Ciltea Marian Marius7122 Data 19 februarie 2021 18:05:12
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>

#include "maxflow.h"

using namespace std;

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

const int N = 10005;

int n, m, e;
vector<int> g[N], isCoupled;
vector<bool> vis;

bool match(int node)
{
    if(vis[node])
        return false;
    vis[node] = true;

    for(int vec : g[node])
    {
        if(isCoupled[vec] == -1)
        {
            isCoupled[vec] = node;
            isCoupled[node] = vec;
            return true;
        }
    }

    for(int vec : g[node])
    {
        if(match(isCoupled[vec]))
        {
            isCoupled[vec] = node;
            isCoupled[node] = vec;
            return true;
        }
    }

    return false;
}

int main()
{
    fin >> n >> m >> e;

    isCoupled.assign(n + m + 1, -1);
    for(int i = 0; i < e; i++)
    {
        int x, y;
        fin >> x >> y;
        g[x].push_back(y+n);
    }

    bool ok;
    do
    {
        vis.assign(n + m + 1, false);
        ok = false;
        for(int i = 1; i <= n; i++)
            if(isCoupled[i] == -1)
                ok = ok || match(i);
    }while(ok);

    int coupled = 0;
    for(int i = 1; i <= n; i++)
        if(isCoupled[i] != -1)
            coupled++;

    fout << coupled << '\n';
    for(int i = 1; i <= n; i++)
        if(isCoupled[i] != -1)
        {
            fout << i << ' ' << isCoupled[i] - n << '\n';
        }

    fin.close();
    fout.close();
    return 0;
}