Cod sursa(job #2963649)

Utilizator popescuadrianpopescuadrian popescuadrian Data 11 ianuarie 2023 19:25:36
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include<vector>

using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
vector<int>adj[100005];
int fre [100005];
int pairst [100005];
int pairdr [100005];
int find(int curr)
{
    int i,k;
    if(fre[curr]==1)
    {
        return 0;
    }
    fre[curr]=1;
    for(i=0;i<adj[curr].size();i++)
    {
        k=adj[curr][i];
        if(pairdr[k]==0)
        {
            pairdr[k]=curr;
            pairst[curr]=k;
            return 1;
        }
    }
    for(i=0;i<adj[curr].size();i++)
    {
        k=adj[curr][i];
        if(find(pairdr[k])==1)
        {
            pairdr[k]=curr;
            pairst[curr]=k;
            return 1;
        }
    }
    return 0;
}
int main()
{
    int n,i,j,l,m,a,b,val,x;
    cin>>n>>x>>m;
    for(i=1;i<=m;i++)
    {
        cin>>a>>b;
        adj[a].push_back(b);
    }
    int match=0;
    int pos=1;
    while(pos==1)
    {
        pos=0;
        for(i=1;i<=n;i++)
        {
            fre[i]=0;
        }
        for(i=1;i<=n;i++)
        {
            if(pairst[i]==0)
            {
                val=find(i);
                pos=max(pos,val);
                match=match+val;
            }
        }
    }
    cout<<match<<'\n';
    for(i=1;i<=n;i++)
    {
        if(pairst[i]!=0)
        {
            cout<<i<<" "<<pairst[i]<<'\n';
        }
    }
    return 0;
}