Cod sursa(job #1930627)

Utilizator vazanIonescu Victor Razvan vazan Data 19 martie 2017 09:06:49
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<bits/stdc++.h>
using namespace std;
#define NMAX 10100
#define MMAX 10100
int nxt[MMAX], last[NMAX], val[MMAX], viz[NMAX];
int cnt = 0;
inline void add(int a, int b){
    cnt++;
    val[cnt] = b;
    nxt[cnt] = last[a];
    last[a] = cnt;
}

int n, m, e, cupl_st[NMAX], cupl_dr[NMAX];
inline bool cuplaj(int a){
    int p, nod;
    if(viz[a])
        return 0;
    viz[a] = 1;
    p = last[a];
    while(p != 0){
        nod = val[p];
        if(cupl_dr[nod] == 0){
            cupl_st[a] = nod;
            cupl_dr[nod] = a;
            return 1;
        }
        p = nxt[p];
    }
    p = last[a];
    while(p != 0){
        nod = val[p];
        if(cuplaj(cupl_dr[nod])){
            cupl_st[a] = nod;
            cupl_dr[nod] = a;
            return 1;
        }
        p = nxt[p];
    }
    return 0;
}

int main(){
    FILE *in, *out;
    in = fopen("cuplaj.in", "r");
    out = fopen("cuplaj.out", "w");
    int l, r;
    fscanf(in, "%d%d%d", &n, &m, &e);
    for(int i = 1; i <= e; i++){
        fscanf(in, "%d%d", &l, &r);
        add(l, r);
    }
    bool done = 1;
    int rasp = 0;
    while(done){
        done = 0;
        memset(viz, 0, sizeof viz);
        for(int i = 1; i <= n; i++){
            if((!cupl_st[i]) && cuplaj(i)){
                rasp++;
                done = 1;
            }
        }
    }
    fprintf(out, "%d\n", rasp);
    for(int i = 1; i <= n; i++){
        if(cupl_st[i]){
            fprintf(out, "%d %d\n", i, cupl_st[i]);
        }
    }
    return 0;
}