Cod sursa(job #1436568)

Utilizator OpportunityVlad Negura Opportunity Data 16 mai 2015 01:40:43
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <vector>
  
using namespace std;
  
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
  
int s[10001],r[10001],l[10001];
vector<int> v[10001];
int n,m,i,j,k,x,y,e,ok,sol;
  
bool cuplaj(int x)
{
    if (s[x])
        return false;
    s[x]=1;
    for (vector<int>::iterator it = v[x].begin(); it != v[x].end(); it++)
    {
        if (r[*it]==0)
        {
            r[*it]=x;
            l[x]=*it;
            return true;
        }
    }
    for (vector<int>::iterator it = v[x].begin(); it != v[x].end(); it++)
    {
        if (cuplaj(r[*it]))
        {
            r[*it]=x;
            l[x]=*it;
            return true;
        }
    }
    return false;
}
  
int main()
{
    fin>>n>>m>>e;
    for (i=1;i<=e;i++)
    {
        fin>>x>>y;
        v[x].push_back(y);
    }
    ok = true;
    while (ok)
    {
        ok = false;
        for (i=1;i<=n;i++)
            s[i]=0;
        
        for (i=1;i<=n;i++)
        {
            if (l[i]==0)
            {
                if (cuplaj(i)) {
                    ok = true;
    				sol++;
    			}
            }
        }
    }

    fout << sol << endl;
    for (i=1;i<=n;i++){
        if (l[i]) {
            fout << i << " " << l[i] << endl;
        }
    }
    return 0;
}