Cod sursa(job #1970795)

Utilizator RaZxKiDDavid Razvan RaZxKiD Data 19 aprilie 2017 16:39:54
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 ST[10005],DR[10005];
bool U[10005];
int n,m,e;
vector<int> L[10005];

void read(){
    in>>n>>m>>e;
    for(int i=1,x,y;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){
        t=0;
        memset(U,0,sizeof(U));
        for(int i=1;i<=n;i++)
            if(!U[i]&&!DR[i])
                t|=pairup(i);
    }
    int r=0;
    for(int i=1;i<=n;i++)
        if(DR[i])
            r++;
    out<<r<<"\n";
    for(int i=1;i<=n;i++){
        if(DR[i])
            out<<i<<" "<<DR[i]<<"\n";
    }
}
int main(){
    read();
    solve();
    return 0;
}