Cod sursa(job #2377264)

Utilizator WayronUrsu Ianis-Vlad Wayron Data 9 martie 2019 06:03:11
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>
#define NMAX 10005
using namespace std;

bool viz[NMAX];
vector<vector<int> > graph = vector<vector<int> >(NMAX, vector<int>());

int dr[NMAX], st[NMAX];

int sol = 0;

bool cuplaj(int nod){
    if(viz[nod]==true)  return false;
    viz[nod] = true;

    for(auto& vec:graph.at(nod)){
        if(dr[vec]==0){
            dr[vec] = nod;
            st[nod] = vec;
            sol++;
            return true;
        }
    }

    for(auto& vec:graph.at(nod)){
        if(cuplaj(dr[vec])==true){
            dr[vec] = nod;
            st[nod] = vec;
            return true;
        }
    }

    return false;
}


int main()
{
    int a, b, e, x, y;

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

    fin>>a>>b>>e;

    for(int i=1; i<=e; i++){
        fin>>x>>y;
        graph.at(x).push_back(y);
    }

    bool ok;

    do {
        ok = false;
        for(int i=1; i<=a; i++) viz[i] = false;

        for(int i=1; i<=a; i++)
            if(st[i]==0)
            ok = ok|cuplaj(i);
    }while(ok);

    fout<<sol<<endl;

    for(int i=1; i<=a; i++){
        if(st[i])   fout<<i<<" "<<st[i]<<endl;
    }
}