Cod sursa(job #750378)

Utilizator blk.irineluIrina Ursateanu blk.irinelu Data 21 mai 2012 23:06:48
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>
#include <cstdio>
#include <algorithm>
#define MAXN  10005

using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

vector <int> graf[MAXN];
int l[MAXN],r[MAXN],u[MAXN];

int pairup(const int n)
{
    if(u[n]) return 0;
    u[n]=1;
    for(vector <int>::iterator i=graf[n].begin();i!=graf[n].end();++i)
    if (!r[*i])
    {
        l[n] = *i;
        r[*i] = n;
        return 1;
    }
    for(vector <int>::iterator i=graf[n].begin();i!=graf[n].end();++i)
    if(pairup(r[*i]))
    {
        l[n] = *i;
        r[*i] = n;
        return 1;
    }
    return 0;
}

int main()
{

    int n, m, cnt_edges;
    f>>n>>m>>cnt_edges;
    for(int i=1;i<=cnt_edges;i++)
    {
        int x, y;
        f>>x>>y;
        graf[x].push_back(y);
    }
    int cuplaj=0;
    for(int i=1;i<=n;i++)
    if (!l[i])
    {
        if (!pairup(i))
         {
          //  memset(u,0,sizeof(u));
            for(int i=0;i<=MAXN;i++)
             u[i]=0;
            cuplaj +=pairup(i);
        }
        else
            cuplaj ++;
    }
    g<<cuplaj<<"\n";
    for(int i=1;i<=n;++i)
    if(l[i]>0)
        g<<i<<" "<<l[i]<<"\n";

    return 0;
}