Cod sursa(job #1390838)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 17 martie 2015 13:14:47
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 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.getline(s,15);
        x=y=0;
        j=0;
        while (s[j]-' ')
            x=x*10+s[j++]-'0';
        j++;
        while (s[j]!=NULL)
            y=y*10+s[j++]-'0';
        memset(s,0,sizeof(s));
        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;
}