Cod sursa(job #2197908)

Utilizator PredaBossPreda Andrei PredaBoss Data 23 aprilie 2018 06:50:39
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;
vector<int>graf[10005],unused;
int pr[10005];
int pai[10005];
int ap[10005];
int n,m,e,x,y,howmany;
bool try_to_change(int pos)
{
    if(ap[pos]==1)
        return 0;
    ap[pos]=1;
    for(int i=0;i<graf[pos].size();i++)
        if(pr[graf[pos][i]]==0)
        {
            pr[graf[pos][i]]=pos;
            pai[pos]=graf[pos][i];
            return 1;
        }
    for(int i=0;i<graf[pos].size();i++)
        if(try_to_change(pr[graf[pos][i]]))
        {
            pr[graf[pos][i]]=pos;
            pai[pos]=graf[pos][i];
            return 1;
        }
    return 0;
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d %d %d\n",&n,&m,&e);
    for(int i=1;i<=e;i++)
    {
        scanf("%d %d\n",&x,&y);
        graf[x].push_back(y);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<graf[i].size();j++)
            if(ap[graf[i][j]]==0)
            {
                pai[i]=graf[i][j];
                pr[graf[i][j]]=i;
                ap[graf[i][j]]=1;
                break;
            }
    }
    bool something_changes=1;
    while(something_changes)
    {
        something_changes=0;
        memset(ap,0,sizeof(ap));
        for(int i=1;i<=n;i++)
            if(pai[i]==0)
                something_changes |=try_to_change(i);
    }
    for(int i=1;i<=n;i++)
        if(pai[i])
        howmany++;
    printf("%d\n",howmany);
    for(int i=1;i<=n;i++)
        if(pai[i])
            printf("%d %d\n",i,pai[i]);
    return 0;
}