Cod sursa(job #1549331)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 12 decembrie 2015 11:28:52
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>
#define DMAX 10009
#define pb push_back
using namespace std;

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

int dfs(int k)
{
    use[k]=1;

    for(int i=0; i<v[k].size(); ++i)
    {
        if(!use[v[k][i]] || c[k]==v[k][i])
        {
            if(!c[v[k][i]])
            {
                c[k]=v[k][i];
                c[v[k][i]]=k;
                use[v[k][i]]=1;
                return 1;
            }
            else
            {
                if(dfs(c[v[k][i]]))
                {
                    c[k]=v[k][i];
                    c[v[k][i]]=k;
                    use[v[k][i]]=1;
                    return 1;
                }
                else continue;
            }
        }
    }
    return 0;
}

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

int main()
{
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    
    cin>>n>>m>>e;
    for(int i=1; i<=e; i++)
    {
        cin>>a>>b;
        b+=n;
        v[a].pb(b);
        v[b].pb(a);
    }
    int ok=1;
    //cuplaj greedy
    while(ok)
    {
        ok=0;
        for(int i=0; i<=n; i++)
        {
            if(!use[i] && !c[i])
            {
                if(dfs(i))
                    ok=1;
                //reset_use();
            }
        }
    }
    int nrc=0;
    for(int i=1;i<=n;i++)
        if(c[i]) nrc++;
    cout<<nrc<<'\n';
    for(int i=1;i<=n;i++)
        if(c[i])
            cout<<i<<' '<<c[i]-n<<'\n';
    return 0;
}