Cod sursa(job #1444311)

Utilizator costyv87Vlad Costin costyv87 Data 29 mai 2015 15:42:52
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#include <vector>
#define nmax 10100

using namespace std;
FILE *f,*g;

int bf[nmax],L[nmax],R[nmax];
vector <int> a[nmax];
int T,n,m,e;

int Try(int x)
{
    if (bf[x] == 1) return 0;
    bf[x] = 1;

    for (int i=0;i<a[x].size();i++)
        if (R[a[x][i]] == 0)
        {
            R[a[x][i]] = x;
            L[x] = a[x][i];
            return 1;
        }

    for (int i=0;i<a[x].size();i++)
        if (Try(R[a[x][i]]))
        {
            R[a[x][i]] = x;
            L[x] = a[x][i];
            return 1;
        }

    return 0;
}



int main()
{
    f=fopen("cuplaj.in","r");
    g=fopen("cuplaj.out","w");

  //  fscanf(f,"%d",&T);

    int i,ok;

    for (T=1;T;T--)
    {
        fscanf(f,"%d%d%d",&n,&m,&e);

        for (i=1;i<=n;i++)
        {
            L[i] = R[i] = 0;
            a[i].clear();
        }

        for (i=1;i<=e;i++)
        {
            int x,y;
            fscanf(f,"%d%d",&x,&y);
            a[x].push_back(y);
        }



        ok = 1;

        while (ok)
        {
            ok = 0;

            for (i=1;i<=n;i++)
                bf[i] = 0;

            for (i=1;i<=n;i++)
                if (L[i] == 0)
                    ok |= Try(i);
        }

        int ans = 0;
        for (i=1;i<=n;i++)
            ans += (L[i]!=0);

        fprintf(g,"%d\n",ans);

        for (i=1;i<=n;i++)
            if (L[i] != 0)
                fprintf(g,"%d %d\n",i,L[i]);
    }

    return 0;
}