Cod sursa(job #2525676)

Utilizator Emil64Emil Centiu Emil64 Data 17 ianuarie 2020 17:48:01
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include <bits/stdc++.h>

using namespace std;

vector<int> g[2005];

int c[10005][10005]={0}, f[10005][10005]={0};
int n, m;

int p[20005]={0};
bool viz[20005];

bool bfs(){
    queue<int> q;
    q.push(0);
    memset(viz, false, sizeof(viz));
    viz[0] = true;
    while(!q.empty()){

        int nod = q.front();
        q.pop();
        if(nod!=n)
            for(int i=0; i<g[nod].size(); i++){
                int adi = g[nod][i];
                if(viz[adi] || f[nod][adi] == c[nod][adi])
                    continue;
                viz[adi] = true;
                q.push(adi);
                p[adi] = nod;
            }
    }
    if(viz[n])
        return true;
    return false;
}

int main()
{
    int i, a, b, cmax, e;
    ifstream _f("cuplaj.in");
    ofstream _g("cuplaj.out");

    _f >> n >> m >> e;
    for(i=1; i<=e; i++){
        _f >> a >> b;
        b+=n;
        g[a].push_back(b);
        g[b].push_back(a);
        c[a][b] = 1;
    }
    for(i=1; i<=n; i++){
        g[0].push_back(i);
        g[i].push_back(0);
        c[0][i] = 1;
    }
    n+=m;
    for(i=n-m+1; i<=n; i++){
        g[n+1].push_back(i);
        g[i].push_back(n+1);
        c[i][n+1] = 1;
    }

    int flux, fmin;
    n++;
    for(flux=0; bfs();){
        for(int j = 0; j< g[n].size(); j++){
            fmin = 0x3f3f3f3f;
            p[n] = g[n][j];
            if(!viz[p[n]] || c[p[n]][n] == f[p[n]][n])
                continue;
            for(int nod = n; nod!=0; nod = p[nod]){
                fmin = min(fmin, c[p[nod]][nod] - f[p[nod]][nod]);
            }
            for(int nod = n; nod!=0; nod = p[nod]){
                f[p[nod]][nod] += fmin;
                f[nod][p[nod]] -= fmin;
            }
            flux += fmin;
        }
    }
    n--;
    _g << flux << "\n";
    for(int i=1; i<n-m+1; i++){
        for(int j = 0; j<g[i].size(); j++)
            if(f[i][g[i][j]] !=0 && g[i][j] != 0){
                _g << i << " " << g[i][j] - (n-m) << "\n";
                continue;
            }
    }

}