Cod sursa(job #3226440)

Utilizator Emilia23Dobra Emilia Emilia23 Data 21 aprilie 2024 14:20:11
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>
#define SIZE 10005
using namespace std;

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

vector<int>a[SIZE];
int n,m,st[SIZE],dr[SIZE],sol;
bool tried[SIZE];

bool cupleaza(int x)
{
    if(tried[x])return 0;
    tried[x]=1;
    for(auto y:a[x])
        if(dr[y]==0)
        {
            sol++;
            st[x]=y;
            dr[y]=x;
            return 1;
        }
    for(auto y:a[x])
        if(cupleaza(dr[y])==1)
        {
            st[x]=y;
            dr[y]=x;
            return 1;
        }
    return 0;
}

void cuplaj()
{
    int i;
    bool ok=1;
    while(ok==1)
    {
        for(i=1;i<=n;i++)
            tried[i]=0;
        ok=0;
        for(i=1;i<=n;i++)
            if(st[i]==0)
                ok|=cupleaza(i);
    }
}

int main()
{
    int e,i,x,y;
    f>>n>>m>>e;
    for(i=1;i<=e;i++)
    {
        f>>x>>y;
        a[x].push_back(y);
    }
    cuplaj();
    g<<sol<<'\n';
    for(i=1;i<=n;i++)
        if(st[i]!=0)g<<i<<' '<<st[i]<<'\n';
    return 0;
}