Cod sursa(job #1962704)

Utilizator RaZxKiDDavid Razvan RaZxKiD Data 11 aprilie 2017 23:36:57
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

int n,m,e;
vector<int> L[10005];

bool U[10005];
int ST[10005],DR[10005];

void read(){
    int x,y;
    in>>n>>m>>e;
    for(int i=1;i<=e;i++){
        in>>x>>y;
        L[x].push_back(y);
    }
}

bool pairup(int nod){
    if(U[nod])
        return 0;
    U[nod]=1;
    for(auto x : L[nod])
        if(!ST[x]){
            ST[x]=nod;
            DR[nod]=x;
            return 1;
        }
    for(auto x : L[nod]){
        if(pairup(ST[x])){
            ST[x]=nod;
            DR[nod]=x;
            return 1;
        }
    }
    return 0;
}
void solve(){
    bool t=1;
    while(t){
        memset(U,0,sizeof(U));
        t=0;
        for(int i=1;i<=n;i++)
            if(!U[i]&&!DR[i])
                t= (pairup(i) || t);
    }
    int r1=0;
    for(int i=1;i<=n;i++)
        if(DR[i])
            r1++;
    out<<r1<<"\n";
    for(int i=1;i<=n;i++)
        if(DR[i])
        out<<i<<" "<<DR[i]<<"\n";
}
int main(){
    read();
    solve();
    return 0;
}