Cod sursa(job #2960257)

Utilizator bogdaniliBogdan Iliescu bogdanili Data 3 ianuarie 2023 21:09:39
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");


int noduri1, noduri2, muchii;
int st[10010];//nodurile din multimea stanga pt cuplaj;
int dr[10010];//nodurile din multimea dreapta pt cuplaj;
int viz[10010];
vector<int>vecini[10010];
int i, ok=1, cupl=0;

int cuplaj(int nod)
{
    int i;
    if (viz[nod]==1) return 0;
    viz[nod]=1;
    for ( i=0; i<vecini[nod].size(); i++)
    {
        int a=vecini[nod][i];
        if (dr[a]==0)
        {
            dr[a]=nod;
            st[nod]=a;
            return 1;
        }
    }
    for ( i=0; i<vecini[nod].size(); i++)
    {
        int a=vecini[nod][i];
        if (cuplaj(dr[a]))
        {
            dr[a]=nod;
            st[nod]=a;
            return 1;
        }
    }
    return 0;
}


int main()
{
    in>>noduri1>>noduri2>>muchii;
    for (i=0; i<muchii; i++)
    {
        int nod1, nod2;
        in>>nod1>>nod2;
        vecini[nod1].push_back(nod2);
    }
    for(ok=1; ok; )
    {
        ok=0;
        memset(viz,0,sizeof(viz));
        for (i=1; i<=noduri1; i++)
            if (st[i]==0)//nu e in cuplaj
                ok= ok | cuplaj(i);
    }
    for (i=1; i<=noduri1; i++)
        if (st[i]>0) cupl++;
    out<<cupl<<'\n';

    for (i=1; i<=noduri1; i++)
        if (st[i]>0) out<<i<<' '<<st[i]<<'\n';
    return 0;
}