Cod sursa(job #1014102)

Utilizator assa98Andrei Stanciu assa98 Data 22 octombrie 2013 08:27:07
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;

const int MAX_N=10100;

vector<int> A[MAX_N];

int l[MAX_N];
int r[MAX_N];

int viz[MAX_N];

int cup(int nod) {
    if(viz[nod]) {
        return 0;
    }
    viz[nod]=1;

    for(vector<int>::iterator it=A[nod].begin(); it!=A[nod].end(); it++) {
        if(!r[*it]) {
            l[nod]=*it;
            r[*it]=nod;
            return 1;
        }
    }

    for(vector<int>::iterator it=A[nod].begin(); it!=A[nod].end(); it++) {
        if(cup(r[*it])) {
            l[nod]=*it;
            r[*it]=nod;
            return 1;
        }
    }

    return 0;
}

int main() {
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    
    int n,m,e;
    scanf("%d%d%d",&n,&m,&e);
    for(int i=1;i<=e;i++) {
        int a,b;
        scanf("%d%d",&a,&b);
        A[a].push_back(b);
    }
    
    bool change=true;
    while(change) {
        change=false;
        memset(viz,0,sizeof(viz));
        for(int i=1;i<=n;i++) {
            if(!l[i]) {
                if(cup(i)) {
                    change=true;
                }
            }
        }
    }

    int sz=0;
    for(int i=1;i<=n;i++) {
        if(l[i]) {
            sz++;
        }
    }
    
    printf("%d\n",sz);
    for(int i=1;i<=n;i++) {
        if(l[i]) {
            printf("%d %d\n",i,l[i]);
        }
    }


    return 0;
}