Cod sursa(job #2047324)

Utilizator Tataru_AdelinTataru Adelin Tataru_Adelin Data 24 octombrie 2017 18:54:37
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>

using namespace std;

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

bool cupleaza(int left,vector<int>& con_left,vector<int>& con_right,vector<vector<int>>& path,bitset<10010>& viz)
{
    if(viz[left])
        return false;
    viz[left]=1;


    for(int i=0;i<path[left].size();i++) ///try to connect to an unconnected node
    {
        if(!con_right[path[left][i]])
        {
            con_right[path[left][i]]=left;
            con_left[left]=path[left][i];

            return true;
        }
    }
    for(int i=0;i<path[left].size();i++) ///if there are no available nodes try to reconnect until you make one available
    {
        if(cupleaza(con_right[path[left][i]],con_left,con_right,path,viz))
        {
            con_right[path[left][i]]=left;
            con_left[left]=path[left][i];

            return true;
        }
    }


    return false;
}

int main()
{
    int left,right,edges,x,y,nr_con=0;
    fin>>left>>right>>edges;
    vector<vector<int>> path(left+10);
    vector<int> con_left(left+5);
    vector<int> con_right(right+5);
    bitset<10010> viz;


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

    int ok=1;

    while(ok)
    {
        ok=0;
        viz.reset();

        for(int i=1;i<=left;i++)
        {
            if(!con_left[i]&&cupleaza(i,con_left,con_right,path,viz))
            {
                nr_con++;
                ok=1;
            }
        }
    }
    fout<<nr_con<<'\n';
    for(int i=1;i<=left;i++)
        if(con_left[i])
            fout<<i<<' '<<con_left[i]<<'\n';



    return 0;
}