Cod sursa(job #1957664)

Utilizator razvandRazvan Dumitru razvand Data 7 aprilie 2017 18:09:58
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.94 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <unordered_set>
#include <climits>
#include <bitset>

using namespace std;

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

int n,m,e;
int N;
int bef[2*10003];
bool viz[2*10003];
bitset<2*10003> v[2*10003];
vector<int> E[2*10003];

bool bfs() {

    for(int i = 0; i <= N; i++) {
        viz[i] = false;
        bef[i] = -1;
    }

    queue<int> Q;
    Q.push(0);
    viz[0] = true;
    int nod;
    int nx;

    while(!Q.empty()) {

        nod = Q.front();
        Q.pop();

        if(nod == N)
            continue;

        for(int i = 0; i < E[nod].size(); i++) {

            nx = E[nod][i];

            if(viz[nx])
                continue;
            //if(v[nod].find(nx) == v[nod].end())
            //    continue;

            bef[nx] = nod;
            //cout << nod << " -> " << nx << '\n';
            viz[nx] = true;
            Q.push(nx);

        }

    }

    //cout << "T " << bef[10] << '\n';

    if(viz[N])
        return true;
    return false;

}

int main() {

    in >> n >> m >> e;
    int x,y;

    for(int i = 1; i <= e; i++) {
        in >> x >> y;
        //v[x][n+y] = 1;
        //v[x].insert(n+y);
        E[x].push_back(n+y);
        E[n+y].push_back(x);
    }

    N = n+m+1;

    for(int i = 1; i <= n; i++) {
       // v[0].insert(i);
        E[0].push_back(i);
        E[i].push_back(0);
    }

    for(int i = 1; i <= m; i++) {
       // v[n+i].insert(N);
        E[n+i].push_back(N);
        E[N].push_back(n+i);
    }

    int ans = 0;

    while(bfs()) {

        for(int i = n+1; i <= n+m; i++) {

            if(!viz[i])
                continue;

            bef[N] = i;
            int crr = N;
            int MI = 1;

            while(crr != 0) {
                //cout << "TEST " << crr << " " << bef[crr] << " " << bef[bef[crr]] << '\n';
               /* if(v[bef[crr]].find(crr) == v[bef[crr]].end()) {
                    MI = 0;
                    break;
                }*/
                crr = bef[crr];
            }

            crr = N;

            //cout << "TEST " << i-n << " " << MI << '\n';

            if(MI == 0)
                continue;

            while(crr != 0) {
                //cout << crr << " ";
                //v[bef[crr]].erase(crr);
                //v[crr].insert(bef[crr]);
                crr = bef[crr];
            }

            //cout << '\n';

            ans++;

        }

    }

    int nx = 0;
    out << ans << '\n';

    for(int i = 1; i <= n; i++) {

        for(int j = 0; j < E[i].size(); j++) {

            nx = E[i][j];

            if(nx == 0)
                continue;

            /*if(v[i].find(nx) == v[i].end()) {
                out << i << " " << nx-n << '\n';
                break;
            }*/

        }

    }

    return 0;
}