Cod sursa(job #1700823)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 11 mai 2016 13:42:57
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>

#define DMAX 20010

using namespace std;

vector <int> v[DMAX];
int c[DMAX], use[DMAX], n, m, k, a, b;

bool dfs(int nod)
{
    use[nod]=1;
    for(int i=0;i<v[nod].size();i++)
    {
        if(use[v[nod][i]]) continue;
        if(c[v[nod][i]]==0)
        {
            c[nod]=v[nod][i];
            c[v[nod][i]]=nod;
            use[v[nod][i]]=1;
            return true;
        }
    }
    for(int i=0;i<v[nod].size();i++)
    {
        if(use[v[nod][i]]) continue;
        if(c[v[nod][i]]!=0)
        {
            use[v[nod][i]]=1;
            if(dfs(c[v[nod][i]]))
            {
                c[nod]=v[nod][i];
                c[v[nod][i]]=nod;
                use[v[nod][i]]=1;
                return true;
            }
        }
    }
    return false;
}

void reset()
{
    for(int i=1;i<=n+m+1;i++)
        use[i]=0;
}

int main()
{
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);

cin>>n>>m>>k;
for(int i=1;i<=k;i++)
{
    cin>>a>>b;
    b+=n;
    v[a].push_back(b);
    v[b].push_back(a);
}
int potCupla=1, ans=0;
while(potCupla)
{
    reset();
    potCupla=0;
    for(int i=1;i<=n;i++)
    {
        if(use[i]==0 && c[i]==0)
        {
            potCupla+=dfs(i);
        }
    }
    ans+=potCupla;

}
cout<<ans<<'\n';
        for(int i=1;i<=n;i++)
    {
        if(c[i]!=0)
            cout<<i<<' '<<c[i]-n<<'\n';
    }
    return 0;
}