Cod sursa(job #2695678)

Utilizator antonioganea3Antonio Ganea antonioganea3 Data 14 ianuarie 2021 10:18:17
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

int N, M;
int result;

int L[10005];
int R[10005];

vector<int> edges[10005];
bool viz[100005];

bool ver(int poz){
    if(viz[poz])
        return 0;

    viz[poz] = true;
    for( auto it : edges[poz] ){
        if( !R[it] )
        {
            L[poz] = it;
            R[it] = poz;
            return 1;
        }
    }

    for( auto it : edges[poz] ){
        if( ver(R[it]) )
        {
            L[poz] = it;
            R[it] = poz;
            return 1;
        }
    }

    return 0;
}

void read(){
    ifstream fin("cuplaj.in");

    int e, x, y;
    fin >> N >> M >> e;

    for( ; e; e-- ){
        fin >> x >> y;
        edges[x].push_back(y);
    }
}

int main()
{
    read();

    bool ok = true;
    while( ok ){
        ok = 0;
        for ( int i = 0; i <= M; i++ ){
            viz[i] = 0;
        }
        for( int i = 1; i <= N; i++ ){
            if( !L[i] && ver(i) ){
                ok = 1;
                result++;
            }
        }

    }

    ofstream fout("cuplaj.out");

    fout << result << '\n';
    for( int i = 1; i <= N; i++ ){
        if( L[i] ){
            fout << i << ' ' << L[i] << '\n';
        }
    }

    return 0;
}