Cod sursa(job #1436570)

Utilizator OpportunityVlad Negura Opportunity Data 16 mai 2015 01:42:14
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 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;
            }
        }
    }
    for (i=1;i<=n;i++)
    {
        if (l[i])
            sol++;
    }
    fout << sol;
    for (i=1;i<=n;i++){
        if (l[i]) {
            fout<<"\n"<<i<<" "<<l[i];
        }
    }
    return 0;
}