Cod sursa(job #2960354)

Utilizator valentin12Valentin Ion Semen valentin12 Data 4 ianuarie 2023 03:38:32
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

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

int N, M, E, u, v, st[10001], dr[10001];
bool viz[10001];
vector<vector<int> > G;

int pairup(int n)
{

if (viz[n])
        return 0;

viz[n] = true;

for (int i = 0; i < G[n].size(); i++)
    {
        int x = G[n][i];
        if (dr[x] == 0 || pairup(dr[x]))
        {
            st[n] = x;
            dr[x] = n;
            return 1;
        }
    }

for(int i = 0; i < G[n].size(); i++)
    {
        int x = G[n][i];
        if (pairup(dr[x]))
        {
            st[n] = x;
            dr[x] = n;
            return 1;
        }
    }

    return 0;

}

int main()
{

    f >> N >> M >> E;

    G.resize(N + 1);

    for(int i = 0; i <= N; i++)
        G[i].resize(M + 1);

    for(int i = 1; i <= E; i++)
    {
        f >> u >> v;
        G[u].push_back(v);
    }

    int sol = 0;

    for(int i = 1; i <= N; i++)
    {
        memset(viz, 0, sizeof(viz));
        sol += pairup(i);
    }

    g << sol-1 << '\n';

    for(int i = 1; i <= N; i++)
        if (st[i])
            g << i << ' ' << st[i] << '\n';



    return 0;

}