Cod sursa(job #2209842)

Utilizator GeorgianBaditaBadita Marin-Georgian GeorgianBadita Data 4 iunie 2018 21:28:33
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
/*
 * Supr* Matching in bipartite graph
 */
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
#define NMAX 10005
#define pb push_back
using namespace std;

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

vector<int> G[NMAX];
int l[NMAX], r[NMAX], u[NMAX];

int pairup(int n){
    if(u[n]) return 0;
    u[n] = 1;
    for(int i = 0; i<G[n].size(); i++){
        if(!r[G[n][i]]){
            l[n] = G[n][i];
            r[G[n][i]] = n;
            return 1;
        }
    }

    for(int i = 0; i<G[n].size(); i++){
        if(pairup(r[G[n][i]])){
            l[n] = G[n][i];
            r[G[n][i]] = n;
            return 1;
        }
    }
    return 0;
}


int main(){
    int n, m, edg;
    f >> n >> m >> edg;
    for(int i = 1; i<=edg; i++){
        int x, y;
        f >> x >> y;
        G[x].pb(y);
    }

    int ch = 1;
    while(ch){
        ch = 0;
        memset(u, 0, sizeof(u));
        for(int i = 1; i<=n; i++){
            if(!l[i]){
                ch |= pairup(i);
            }
        }
    }

    int cuplaj = 0;
    for(int i = 1; i<=n; i++){
        cuplaj += (l[i] > 0);
    }
    g << cuplaj << '\n';
    for(int i = 1; i<=n; i++){
        if(l[i] > 0){
            g << i << ' ' << l[i] << '\n';
        }
    }

    return 0;
}