Cod sursa(job #1390851)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 17 martie 2015 13:19:23
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <bitset>
#include <cstring>
#include <vector>
#define nmax 10005
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector <int> v[nmax];
bitset <nmax> uz;
int lef[nmax],righ[nmax];
int n,m,e,ok,sol;
char s[15];

int cuplaj(int x)
{
    int i,y;
    uz[x]=1;
    for (i=0;i<v[x].size();i++) {
        y=v[x][i];
        if (righ[y]==0) {
            lef[x]=y;
            righ[y]=x;
            return 1;
        }
    }
    for (i=0;i<v[x].size();i++) {
        y=v[x][i];
        if (uz[righ[y]]==0&&cuplaj(righ[y])) {
            lef[x]=y;
            righ[y]=x;
            return 1;
        }
    }
    return 0;
}

int main()
{
    int i,j,x,y;
    f>>n>>m;
    f>>e;f.get();
    for (i=1;i<=e;i++) {
        f>>x>>y;
        v[x].push_back(y);
    }
    do {
        uz.reset();
        ok=0;
        for (i=1;i<=n;i++)
            if (lef[i]==0&&cuplaj(i))
                ok=1;
    } while (ok);
    sol=0;
    for (i=1;i<=n;i++)
        if (lef[i])
            sol++;
    g<<sol<<'\n';
    for (i=1;i<=n;i++)
        if (lef[i])
            g<<i<<' '<<lef[i]<<'\n';
    return 0;
}