Cod sursa(job #2962162)

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

queue<pair<int, int>> bfs;
vector<vector<int>> parent(2);
vector<vector<vector<int>>> lista(2);
vector<vector<vector<int>>> cap(2);

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

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

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

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


    parent[0].resize(m+1, -2);
    parent[1].resize(n+1, -2);
    int p, F=0, set;

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

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

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

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

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

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

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

        else break;
    }


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