Cod sursa(job #2962701)

Utilizator VladTalpigaVlad Talpiga VladTalpiga Data 8 ianuarie 2023 23:13:53
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
//Infoarena Cuplaj maxim in graf bipartit

#include <bits/stdc++.h>

using namespace std;

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

int n, m, e;
bool vizitat[10001];
vector <int> adj[10001];
int st[10001], dr[10001];

bool cuplaj(int node)   // cupleaza partitiile stanga si dreapta
{
    if(vizitat[node])
        return false;

    vizitat[node] = true;

    for(auto vecin : adj[node]) // cautam sa vedem daca nodul mai are vecini care nu sunt inca cuplati
        if (dr[vecin] == 0)
        {
            st[node] = vecin;
            dr[vecin] = node;
            return true;
        }

    for(auto vecin : adj[node])
    {
        if(cuplaj(dr[vecin]))
        {
            st[node] = vecin;
            dr[vecin] = node;
            return true;
        }
    }
    return false;
}

int main()
{
    int x, y, nrcuplaje = 0, i;
    bool cuplate;

    f >> n >> m >> e;

    for(i = 1; i <= e; ++i)
    {
        f >> x >> y;
        adj[x].push_back(y);
    }

    do{
        memset(vizitat, false, sizeof(vizitat));
        cuplate = false;

        for(i = 1; i <= n; ++i)
            if(st[i] == 0)
                cuplate |= cuplaj(i);
    }while(cuplate);    //cat timp facem cuplaje

    for(int i = 1; i <= n; ++i)
        if(st[i] != 0)
            nrcuplaje++;

    g << nrcuplaje << endl;

    for(i = 1; i <= n; i++)
        if(st[i] != 0)
            g << i << " " << st[i] << endl;

    return 0;
}