Cod sursa(job #1369952)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 3 martie 2015 12:24:18
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define pb push_back
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
vector< vector<int> > a;
vector<int> gr1,gr2;
vector<bool> v;
int n,m,k;
//........................
int pairup(int x)
{
    if(v[x])return 0;
    v[x]=true;
    for(vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
        if(gr2[*i]==0)
        {
            gr1[x]=*i;
            gr2[*i]=x;
            return 1;
        }
     for(vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
        if(pairup(gr2[*i])==1)
        {
            gr1[x]=*i;
            gr2[*i]=x;
            return 1;
        }
    return 0;
}
int main()
{
    in>>n>>m>>k;
    a=vector< vector<int> >(n+1);
    gr1=vector<int>(n+1);
    gr2=vector<int>(m+1);
    for(;k;k--)
    {
        int x,y;
        in>>x>>y;
        a[x].pb(y);
    }
    //...................
    for(int step=1;step;)
    {
        step=0;
        v=vector<bool>(n+1);
        for(int i=1;i<=n;i++)
            if(gr1[i]==0)
            step+=pairup(i);
    }
    //....................
    int cnt=0;
    for(int i=1;i<=n;i++)
        if(gr1[i])
        cnt++;
    out<<cnt<<'\n';
    for(int i=1;i<=n;i++)
        if(gr1[i])
        out<<i<<' '<<gr1[i]<<'\n';
    return 0;
}