Cod sursa(job #1073520)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 6 ianuarie 2014 15:02:23
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<cstdio>
#include<vector>
#include<bitset>
#include<utility>

using namespace std;

typedef pair<int,int> PII;
const int NMAX = 10005;
const int MMAX = 10005;

int N,M,E;
int T[NMAX];
int R[MMAX];
bitset<NMAX> viz;
vector<int> V[NMAX];
vector<PII> sol;

int pairUp(int nod)
{
    if(viz[nod]) return 0;
    vector<int>::iterator it;
    viz[nod]=1;
    for(it=V[nod].begin(); it!=V[nod].end(); it++)
        if(!R[*it] || pairUp(R[*it]))
        {
            T[nod]=*it;
            R[*it]=nod;
            return 1;
        }
    return 0;
}

int main()
{
    int i,a,b;
    bool ok;
    vector<PII>::iterator it;
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&N,&M,&E);
    for(; E; --E)
    {
        scanf("%d%d",&a,&b);
        V[a].push_back(b);
    }
    for(ok=1; ok; )
    {
        ok=0;
        viz=0;
        for(i=1; i<=N; i++)
            if(!T[i]) ok=ok|pairUp(i);
    }
    for(i=1; i<=N; i++)
        if(T[i]) sol.push_back(make_pair(i,T[i]));
    printf("%d\n",sol.size());
    for(it=sol.begin(); it!=sol.end(); it++)
        printf("%d %d\n",it->first,it->second);
    return 0;
}