Cod sursa(job #981403)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 7 august 2013 01:05:03
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

vector <int> G[10001];
int l[10001],r[10001];
int n1,n2,m,a,b;
bool ok,v[10001];

bool find_augmenting_path (int node)
{
    if (v[node]) return 0;
    v[node]=1;

    for (vector<int>::iterator it=G[node].begin(); it!=G[node].end(); ++it)
    {
        if (!r[*it])
        {
            l[node]=*it;
            r[*it]=node;
            return 1;
        }
    }

    for (vector<int>::iterator it=G[node].begin(); it!=G[node].end(); ++it)
    {
        if (find_augmenting_path(r[*it]))
        {
            l[node]=*it;
            r[*it]=node;
            return 1;
        }
    }
    return 0;
}

int main ()
{
    fin>>n1>>n2>>m;

    for (int i=1; i<=m; i++)
    {
        fin>>a>>b;
        G[a].push_back(b);
    }

    int matching=0;

    do
    {
       ok=0;
       memset (v,0,n1+1);
       for (int i=1; i<=n1; i++) if (!l[i])
            if (find_augmenting_path (i))
       {
           ok=1;
           matching++;
       }

    } while (ok);

    fout<<matching<<"\n";

    for (int i=1; i<=n1; i++)
    {
        if (l[i]>0)
        {
            fout<<i<<" "<<l[i]<<"\n";
        }
    }
    return 0;
}