Cod sursa(job #2966942)

Utilizator mariailincailinca maria nechita mariailinca Data 18 ianuarie 2023 19:03:29
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.54 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

struct Edge {
    int x, y, cap, poz;
};

int n, m, e, s, t;
vector <Edge> edges;
vector <vector<int>> v;
vector <int> tata;
vector <bool> visited;

void addEdge(int x, int y) {
    int dim = edges.size();
    v[x].push_back(dim);
    v[y].push_back(dim + 1);
    edges.push_back({x, y, 1, dim + 1});
    edges.push_back({y, x, 0, dim});
}

bool bfs() {
    fill(visited.begin(), visited.end(), 0);
    queue <int> q;
    q.push(s);
    visited[s] = true;
    int node;
    while(!q.empty()) {
        node = q.front();
        q.pop();
        if(node == t)
            continue;
        for(const auto& i : v[node]) {
            auto edge = edges[i];
            if(!visited[edge.y] && edge.cap) {
                tata[edge.y] = i;
                visited[edge.y] = true;
                q.push(edge.y);
            }
        }
    }
    return visited[t];
}

int getMaxFlow() {
    int F = 0;
    while(bfs()) {
        for(const auto& i : v[t]) {
            if(!visited[edges[i].y])
                continue;
            auto edge = edges[i];
            tata[t] = edge.poz;
            int minFlow = 2e9;
            for (int node = t; node != s; node = edges[tata[node]].x) {
                if (edges[tata[node]].cap < minFlow)
                    minFlow = edges[tata[node]].cap;
            }
            if(minFlow == 0)
                continue;
            F += minFlow;
            for (int node = t; node != s; node = edges[tata[node]].x) {
                edges[tata[node]].cap -= minFlow;
                edges[edges[tata[node]].poz].cap += minFlow;

            }
        }
    }
    return F;
}


int main() {
    v = vector <vector<int>> (n + m + 2);
    tata = vector <int> (n + m + 2);
    visited = vector <bool> (n + m + 2);

    fin >> n >> m >> e;
    t = n + m + 1;
    int x, y;
    for(int i = 1; i <= e; i ++) {
        fin >> x >> y;
        addEdge(x, y + n);
    }

    //cream muchii intre sursa si nodurile din partea stanga a grafului bip
    for(int i = 1; i <= n; i ++)
        addEdge(s, i);

    // cream muchii din partea stanga a grafului bipartit catre dreapta
    for(int i = n + 1; i <= n + m; i ++)
        addEdge(i, n + m + 1);
    
    fout << getMaxFlow() << '\n';
    for(auto edge : edges)
        if(edge.x < edge.y && edge.x != s && edge.y != t && edge.cap == 0)
            fout << edge.x << " " << edge.y - n << '\n';
    return 0;
}