Cod sursa(job #2817818)

Utilizator andreea_07Andreea Georgescu andreea_07 Data 14 decembrie 2021 11:44:29
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;

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


vector<vector<int>> graf;
vector <pair<int,int>> cuplaj;
int st[10001],dr[10001];
bool viz[10001];
int n, m, e;



bool dfs_cuplaj(int s)
{
    if(viz[s]!=0)
            return 0;

    viz[s] = 1;
    vector<int>::iterator it;

    for (it = graf[s].begin(); it<graf[s].end();it++)
        if(!dr[*it])
        {
            dr[*it] = s;
            st[s] = *it;
            return 1;
        }

     for (it = graf[s].begin(); it<graf[s].end();it++)
        if(dfs_cuplaj(dr[*it]))
        {
            dr[*it] = s;
            st[s] = *it;
            return 1;
        }


}

vector<pair<int,int>> cuplaje()
{
    bool ok = 1;
    int i;

    while(ok!=0)
    {
        ok= 0;
        for( i=1; i<=n; i++)
            viz[i]=0;


        for( i = 1; i <= n; ++i)
            if(!st[i])
                if(dfs_cuplaj(i)==1)
                    ok=1;
    }
    for( i = 1; i <= n; ++i)
        if(st[i]!=0)
            cuplaj.push_back(make_pair(i,st[i]));

    return cuplaj;


}

int main()
{
    fin>>n>>m>>e;

    graf.resize(10001);
    for(int i = 1; i <= e; ++i)
    {
        int x, y;
        fin>>x>>y;
        graf[x].push_back(y);
    }

    cuplaje();

    cout<<cuplaj.size()<<"\n";

    for(int i=0; i<cuplaj.size(); i++)
        cout<<cuplaj[i].first<<" "<<cuplaj[i].second<<"\n";


    return 0;
}