Cod sursa(job #1362743)

Utilizator addy01adrian dumitrache addy01 Data 26 februarie 2015 15:08:49
Problema Cuplaj maxim in graf bipartit Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <vector>
#include <cstring>
#include <fstream>

using namespace std;

const int maxn =2*10100;

vector <int> Graf[maxn];
int mate[maxn],changeth=1,N,M,E;
bool viz[maxn];

bool match(int nod)
{
    if(viz[nod])
        return 0;

    viz[nod]=1;

    vector <int> :: iterator it;
    for(it=Graf[nod].begin();it!=Graf[nod].end();it++)
        if(!mate[*it]){
            viz[*it]=1;
            mate[nod]=*it;
            mate[*it]=nod;
            return 1;
        }

    for(it=Graf[nod].begin();it!=Graf[nod].end();it++)
        if(match(mate[*it])){
            mate[nod]=*it;
            mate[*it]=nod;
            return 1;
        }

    return 0;
}

int main()
{
    ifstream in("cuplaj.in");
    ofstream out("cuplaj.out");
    int x,y,i;
    in>>N>>M>>E;
    while(E--)
    {
        in>>x>>y;
        y+=N+1;
        Graf[x].push_back(y);
        Graf[y].push_back(x);
    }

    while(changeth)
    {
        changeth=0;

        memset(viz,0,sizeof(viz));

        for(i=1;i<=N;i++)
            if(!mate[i])
                changeth = match(i);
    }

    changeth=0;
    for(i=1;i<=N;i++)
        if(mate[i]>0)
            changeth++;

    out<<changeth<<"\n";

    for(i=1;i<=N;i++)
        if(mate[i]>0)
        out<<i<<" "<<mate[i]-N-1<<"\n";
    return 0;
}