Cod sursa(job #1919145)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 9 martie 2017 18:07:18
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

int n, m, i, j, x, y,e;
bool viz[10005];
int lft[10005], rgt[10005];
vector <int> ls[10005];

bool leg(int x) {
    int l = ls[x].size(), i,y;
    if (viz[x])
        return 0;
    viz[x]=1;
    for (i = 0; i < l; i++) {
        y = ls[x][i];
        if (rgt[y] == 0) {
            lft[x]=y;
            rgt[y]=x;
            return 1;
        }
    }
    for (i = 0; i < l; i++) {
        y = ls[x][i];
        if (leg(rgt[y])) {
            lft[x]=y;
            rgt[y]=x;
            return 1;
        }
    }
    return 0;
}

int main() {

    f >> n >> m>>e;
    for (i = 1; i <= e; i++) {
        f >> x >> y;
        ls[x].push_back(y);
    }
    bool ok = 1;
    while (ok) {
        ok = 0;
        memset(viz,0,sizeof(viz));
        for (i = 1; i <= n; i++)
            if (lft[i] == 0 && leg(i))
                ok = 1;
    }
    int sol =0;
    for (i = 1; i <= n; i++)
        sol+=(lft[i]>0);
    g<<sol<<'\n';
    for (i = 1; i <= n; i++)
        if (lft[i])
            g<<i<<' '<<lft[i] <<'\n';
    return 0;
}