Cod sursa(job #1934085)

Utilizator AkrielAkriel Akriel Data 21 martie 2017 09:41:47
Problema Cuplaj maxim in graf bipartit Scor 28
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N = 10005;

vector <int> nodes[N];
bitset <N>  visited;

int leftNode[N], rightNode[N];

int leftSize, rightSize, totalEdges, contor;

inline void readVariables(){
    fin >> leftSize >> rightSize >> totalEdges;

    int origin, destination;
    for ( int index = 1; index <= totalEdges; index++ ){
        fin >> origin >> destination;
        nodes[origin].push_back(destination);
    }
}

int augmentation(int node){
    if ( visited[node] )
        return 0;
    visited[node] = true;

    for ( auto it : nodes[node] ){
        if ( !leftNode[it] ){
            leftNode[it] = node;
            rightNode[node] = it;
            return 1;
        }
    }

    for ( auto it : nodes[node] ){
        if ( augmentation(it) ){
            leftNode[it] = node;
            rightNode[node] = it;
            return 1;
        }
    }
    return 0;
}

bool checkCompatibility(){
    bool okay = 0;

    for ( int index = 1; index <= leftSize; index++ ){
        visited[index] = 0;
    }

    for ( int index = 1; index <= leftSize; index++ ){
        if ( !rightNode[index] and augmentation(index) ){
            contor++;
            okay = 1;
        }
    }
    return okay;
}

void solveProblem(){
    for ( ; checkCompatibility(); );

    fout << contor << "\n";
    for ( int index = 1; index <= leftSize; index++ )
        if ( rightNode[index] )
            fout << index << " " << rightNode[index] << "\n";
}

int main(){
    readVariables();
    solveProblem();
}