Cod sursa(job #2740388)

Utilizator RobertAcAcatrinei Robert-Marian RobertAc Data 12 aprilie 2021 19:31:36
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
vector<vector<int>> s(10001);
vector<vector<int>> d(10001);
vector<int> l(10001);
vector<int> r(10001);
vector<bool> viz(10001);
int rez;
bool pairup(int nod){
    if(viz[nod])return 0;
    viz[nod]=1;
    for(auto v:s[nod]){
        if(r[v]==-1){
            r[v]=nod;
            l[nod]=v;
            return 1;
        }
    }
    for(auto v:s[nod]){
        if(pairup(r[v])){
            r[v]=nod;
            l[nod]=v;
            return 1;
        }
    }
    return 0;
}

int main(){
    int n,m,e;
    in>>n>>m>>e;
    for(int i=0;i<e;i++){
        int x,y;
        in>>x>>y;
        s[x].push_back(y);
        d[y].push_back(x);
    }
    for(int i=1;i<=n;i++){
        l[i]=-1;
    }

    for(int i=1;i<=m;i++){
        r[i]=-1;
    }

    while(true){
        int t=rez;
        for(int i=1;i<=n;i++)if(l[i]==-1)rez+=pairup(i);
        for(int i=1;i<=n;i++)viz[i]=0;
        if(t==rez)break;
    }

    out<<rez<<"\n";
    for(int i=1;i<=n;i++){
        if(l[i]!=-1){
            out<<i<<" "<<l[i]<<"\n";
        }
    }

}