Cod sursa(job #2140359)

Utilizator TudorFinaruTudor Cristian Finaru TudorFinaru Data 23 februarie 2018 12:36:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include<vector>
#include<cstring>
#include<fstream>
#define INF 10001
 using namespace std;

vector<int> graph[INF];
int n,m,e;
int vizitat[INF];///nodurile folosite intr-o iteratie
int match1[INF],match2[INF];///cuplajele realizate - in ambele sensuri

 ifstream f("cuplaj.in");
 ofstream g("cuplaj.out");

int match(int ind)
{
    if(vizitat[ind])return 0;///daca a mai fost folosit in interatia curenta, ne intoarcem
    vizitat[ind]=1;///il marcam ca fiind folosit

    for(vector<int>::iterator it=graph[ind].begin();it!=graph[ind].end();it++)
        if(match2[*it]==0)///incercam mai intai sa-l cuplam cu un nod adiacent liber
        {
            match1[ind]=*it;
            match2[*it]=ind;
            return 1;///daca reusim, ne intoarcem
        }

    for(vector<int>::iterator it=graph[ind].begin();it!=graph[ind].end();it++)
        if(match(match2[*it]))///inceram a doua oara sa eliberam un nod adiacent ocupat
        {
            match1[ind]=*it;
            match2[*it]=ind;
            return 1;///daca reusim sa eliberam un loc, il cuplam cu nodul curent
        }

    return 0;///daca nu reusim sa-l cuplam
}



int main()
{ ///citire graf
    f>>n>>m>>e;
    for(int i=1;i<=e;++i)
    { int x,y;
      f>>x>>y;
      graph[x].push_back(y);
    }

    int ok=1;
    while(ok)///cat timp s-a facut o cuplare in iteratia anterioara => este posibil sa mai putem cupla ceva
    {
        ok=0;
        memset(vizitat,0,sizeof(vizitat));///resetam vizitat

        for(int i=1;i<=n;++i)
            if(!match1[i]) ok+=match(i);///daca nodul curent nu e cuplat, incercam sa-l cuplam
    }

    int matches=0;
    for(int i=1;i<=n;i++)
        if(match1[i])matches++;///numaram cuplajele

    g<<matches<<'\n';

    for(int i=1;i<=n;i++)
            if(match1[i])
                  g<<i<<' '<<match1[i]<<'\n';///scriem cuplajele
}