Cod sursa(job #1926825)

Utilizator vazanIonescu Victor Razvan vazan Data 14 martie 2017 18:27:18
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include<fstream>
#include<cstring>
using namespace std;

class GRAF{
public:
    GRAF(int n, int m, int orn);
    void add(int a, int b);
    int* muchii(int a);
private:
    int *nxt, *last, *val, *mch, cnt, kn;

};
GRAF::GRAF(int n, int m, int orn):cnt(0), kn(orn){
    nxt = new int [m + 1];
    memset(nxt, 0, sizeof(int) * (m + 1) );
    val = new int [m + 1];
    memset(val, 0, sizeof(int) * (m + 1) );
    last = new int [n + 1];
    memset(last, 0, sizeof(int) * (n + 1) );
    mch = new int [min(n, m) + 1];
    val[0] = 0;
    nxt[0] = 0;
    last[0] = 0;
}
void GRAF::add(int a, int b){
    cnt++;
    val[cnt] = b;
    nxt[cnt] = last[a];
    last[a] = cnt;
}
int* GRAF::muchii(int a){
    mch[0] = 0;
    for(int p = last[a]; p; p = nxt[p]){
        mch[++mch[0]] = val[p] - kn;
    }
    return mch;
}

int cuplaj(int n, GRAF &G, int* &cuplat_dr, int* &cuplat_st, int* &viz){
    int *v = G.muchii(n);
    if(viz[n])return 0;
    viz[n] = 1;
    for(int i = 1; i <= v[0]; i++)
        if(!cuplat_dr[v[i]]){
            cuplat_dr[v[i]] = n;
            cuplat_st[n] = v[i];
            return 1;
        }
    for(int i = 1; i <= v[i]; i++)
        if(cuplaj(cuplat_dr[v[i]], G, cuplat_dr, cuplat_st, viz)){
            cuplat_st[n] = v[i];
            cuplat_dr[v[i]] = n;
            return 1;
        }
    return 0;
}

int main(){
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
    int *cuplat_dr,*cuplat_st, a, b, n, m, e, *viz;
    fin >> n >> m >> e;
    GRAF G(n + m, e, n);
    cuplat_dr = new int[n + 1];
    memset(cuplat_dr, 0, sizeof(int) * (n + 1) );
    cuplat_st = new int[m + 1];
    memset(cuplat_st, 0, sizeof(int) * (m + 1) );
    viz = new int[n + 1];

    for(int i = 1; i <= e; i++){
        fin >> a >> b;
        G.add(a, b + n);
    }
    int* debug = G.muchii(1);
    bool be = 1;
    while(be){
        memset(viz, 0, sizeof(int) * (n + 1));
        be = 0;
        for(int i = 1; i <= n; i++){
            if(!cuplat_st[i])
                if(cuplaj(i, G, cuplat_dr, cuplat_st, viz))
                    be = 1;
        }
    }
    int rasp = 0;
    for(int i = 1; i <= n; i++)
        if(cuplat_st[i])
            rasp++;
    fout << rasp << endl;
    for(int i = 1; i <= n; i++)
        if(cuplat_st[i])
            fout << i << ' ' << cuplat_st[i] << endl;
    return 0;
}