Cod sursa(job #1321182)

Utilizator retrogradLucian Bicsi retrograd Data 18 ianuarie 2015 20:24:08
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
#include<vector>

#define MAXN 10001

using namespace std;
typedef int var;

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

var L[MAXN], R[MAXN];
vector<var> CON[MAXN];
bool VIZ[MAXN];
bool E[MAXN][MAXN];

var n, m;

bool match(var v) {
    if(VIZ[v]) return false;
    VIZ[v] = 1;
    for(vector<var>::iterator it = CON[v].begin(); it!=CON[v].end(); ++it) {
        var w = *it;
        if(L[w] == 0) {
            R[v] = w;
            L[w] = v;
            return true;
        }
    }
    for(vector<var>::iterator it = CON[v].begin(); it!=CON[v].end(); ++it) {
        var w = *it;
        if(match(L[w])) {
            R[v] = w;
            L[w] = v;
            return true;
        }
    }
    return false;
}

void solve() {
    bool ok = 1;
    while(ok) {
        ok = 0;
        fill(VIZ+1, VIZ+n+1, 0);
        for(var i=1; i<=n; i++) {
            if(R[i] == 0) {
                ok |= match(i);
            }
        }
    }
}

int main() {
    var T, a, b, e, count;
    fin>>T;
    while(T--) {
        fin>>n>>m>>e;
        count = 0;
        while(e--) {
            fin>>a>>b;
            if(E[a][b] == 0)
                CON[a].push_back(b);
            E[a][b] = 1;
        }

        solve();

        for(var i=1; i<=n; i++) {
            count += (R[i]!=0);
            //fout<<R[i]<<" ";
        }
        fout<<count<<'\n';
        fill(L+1, L+m+1, 0);
        fill(R+1, R+n+1, 0);
    }
    return 0;
}