Cod sursa(job #1953818)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 5 aprilie 2017 00:53:12
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include<vector>
using namespace std;
vector<int> u,r,l;
vector< vector<int> > la;
int n,m,e,x,y,nr;
bool ok;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
bool pairup(int x)
{
    if(u[x]) return 0;
    u[x]=1;
    for(unsigned int i=0;i<la[x].size();i++)
        {
            int nod=la[x][i];
            if(!r[nod]){r[nod]=x;l[x]=nod;return 1;}
        }
    for(unsigned int i=0;i<la[x].size();i++)
        {
            int nod=la[x][i];
            if(pairup(r[nod])){r[nod]=x;l[x]=nod;return 1;}
        }
    return 0;
}
int main()
{
    f>>n>>m>>e;u.resize(n+1);l.resize(n+1);r.resize(m+1);la.resize(n+1);
    for(int i=1;i<=e;i++)
        {
            f>>x>>y;
            la[x].push_back(y);
        }
    while(!ok)
        {
            ok=1;
            u.assign(n+1,0);
            for(int i=1;i<=n;i++) if(!l[i]) ok|=pairup(i);
        }
    for(int i=1;i<=n;i++) nr+=(l[i]>0);
    g<<nr<<'\n';
    for(int i=1;i<=n;i++)
        if(l[i]) g<<i<<' '<<l[i]<<'\n';
    return 0;
}