Cod sursa(job #3040709)

Utilizator pctirziuTirziu Petre pctirziu Data 30 martie 2023 12:19:10
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
const int nmax = 1e4 + 5;
vector <int> edge[nmax];
int st[nmax], dr[nmax], viz[nmax];
bool find_pair(int node)
{
    if(viz[node])
        return false;
    viz[node] = 1;
    for(int i = 0; i < edge[node].size(); i++){
        int curr = edge[node][i];
        if(!dr[curr]){
            dr[curr] = node;
            st[node] = curr;
            return true;
        }
    }
    for(int i = 0; i < edge[node].size(); i++){
        int curr = edge[node][i];
        if(find_pair(dr[curr])){
            st[node] = curr;
            dr[curr] = node;
            return true;
        }
    }
    return false;
}
int main()
{
    int n1, n2, m;
    cin >> n1 >> n2 >> m;
    for(int i = 1; i <= m; i++){
        int x, y;
        cin >> x >> y;
        edge[x].push_back(y);
    }
    while(1){
        bool ok = false;
        for(int i = 1; i <= n1; i++)
            viz[i] = 0;
        for(int i = 1; i <= n1; i++){
            if(!st[i])
                ok |= find_pair(i);
        }
        if(!ok)
            break;
    }
    vector <pair<int, int>> ans;
    for(int i = 1; i <= n1; i++){
        if(st[i])
            ans.push_back({i, st[i]});
    }
    cout << ans.size() << "\n";
    for(int i = 0 ; i < ans.size(); i++)
        cout << ans[i].first << " " << ans[i].second << "\n";
    return 0;
}