Cod sursa(job #2962115)

Utilizator maria10Cioclov Maria maria10 Data 7 ianuarie 2023 19:32:50
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

queue<int> bfs;
vector<int> parent;
vector<vector<int>> lista, cap;

int main(){
    int n, m, e, x, y;
    fin>>n>>m>>e;
    m = n + m;
    lista.resize(m+2);
    cap.resize(m+2);
    for(int i=0;i<=m+1;i++) cap[i].resize(m+2);

    for(int i=1; i<=e; i++){
        fin>>x>>y;
        y = n + y;
        lista[x].push_back(y);
        lista[y].push_back(x);
        cap[x][y] = 1;
    }

    for(int i=1; i<=n; i++){
        lista[0].push_back(i);
        lista[i].push_back(0);
        cap[0][i] = 1;
    }

    for(int i=n+1; i<=m; i++){
        lista[m+1].push_back(i);
        lista[i].push_back(m+1);
        cap[i][m+1] = 1;
    }

    parent.resize(m+2, -2);
    int p, F=0;

    while(true){
        bfs.push(0);
        parent[0] = -1;

        while(!bfs.empty()){
            x = bfs.front();
            bfs.pop();

            for(int y: lista[x])
                if(parent[y] == -2  && cap[x][y]) {
                    parent[y] = x;
                    if(y == m+1) break;
                    bfs.push(y);
                }

            if(parent[m+1] != -2) break;
        }

        p = parent[m+1];
        if(p != -2) {
            F++;

            x = m+1;
            p = parent[x];
            while (p != -1){
                cap[p][x] -= 1;
                cap[x][p] += 1;
                x = p;
                p = parent[p];
            }

            fill(parent.begin(), parent.end(), -2);
            while(!bfs.empty()) bfs.pop();
        }

        else break;
    }


    fout<<F<<endl;
    for(int i=1; i<=n; i++)
        for(int j: lista[i])
            if(!cap[i][j] && j) fout<<i<<" "<<j-n<<endl;
}