Cod sursa(job #1625337)

Utilizator horiainfoTurcuman Horia horiainfo Data 2 martie 2016 18:15:55
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <cstdio>
#include <iostream>
#include <vector>

#define LGM 20005
using namespace std;
//ofstream fout("cuplaj.out");
vector<int>graf[LGM];
int pas,m,n,a,b,ok,i,j,nr,viz[LGM],c[LGM],e;
bool dfs(int nod)
{
    viz[nod] = pas;
    for(int i=0;i<graf[nod].size();i++)
    {
        if(viz[graf[nod][i]] == pas)
            continue;
        if(c[graf[nod][i]] != 0)
        {
            viz[graf[nod][i]] = pas;
            if(dfs(c[graf[nod][i]]))
            {
                c[nod] = graf[nod][i];
                c[graf[nod][i]] = nod;
                return 1;
            }
        }
        else
        {
            nr++;
            c[nod] = graf[nod][i];
            c[graf[nod][i]] = nod;
            return 1;
        }
    }
    return 0;
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&n,&m,&e);
    for(int i=1;i<=e;i++)
    {
        scanf("%d%d",&a,&b);
        graf[a].push_back(b+n);
        graf[b+n].push_back(a);
    }
    ok = 1; i = a;
    while(ok)
    {
        ok = 0;
        for(j=0;j<graf[i].size();j++)
            if(viz[graf[i][j]] == 0)
            {
                viz[graf[i][j]] = 1;
                if(c[i] == 0)
                    c[i] = graf[i][j], c[graf[i][j]] = i, nr++;
                i = graf[i][j];
                ok = 1;
                break;
            }
    }
    ok = 1; pas = 1;
    while(ok)
    {
        ok=0;
        for(int i=1;i<=n;i++)
            if(c[i] == 0)
            {
                pas++;
                if(dfs(i))
                    ok=1;
            }
    }
    printf("%d\n",nr);
    for(int i=1;i<=n;i++)
        if(c[i]!=0)
            printf("%d %d\n",i,c[i]-n);
    return 0;
}