Cod sursa(job #930849)

Utilizator PatrikStepan Patrik Patrik Data 27 martie 2013 20:55:03
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
    #include<cstdio>
    #include<vector>
    using namespace std;
    #define MAX 10001
    #define pb push_back
    int N , M ,E  , l[MAX] , r[MAX] , pairs , ind , viz[MAX];
    bool  sw;
    vector<int> G[MAX] ;

    void citire();
    void solve();
    void tipar();
    bool cuplaj(int nod);

    int main()
    {
        citire();
        solve();
        tipar();
        return 0;
    }

    void citire()
    {
        int x , y ;
        freopen("cuplaj.in" , "r" , stdin );
        scanf("%d%d%d" , &N , &M , &E);
        for(int i = 1 ; i <= E ; ++i )
        {
            scanf("%d%d" , &x , &y);
            G[x].pb(y);
        }
    }

    void solve()
    {
        do
        {
            ind++;
            sw = 0;
        for(int i = 1 ; i <= N ; ++i )
            if(!l[i])
                sw = (sw || cuplaj(i));
        }while(sw);
    }

    void tipar()
    {
        freopen("cuplaj.out" , "w" , stdout );
        for(int i = 1 ; i <= N ; ++i )if(l[i])pairs++;
        printf("%d\n" , pairs);
        for(int i = 1 ; i <= N ; ++i )
            if(l[i])printf("%d %d\n" , i , l[i]);
    }

    bool cuplaj(int nod)
    {
        if(viz[nod]==ind)return 0;
        viz[nod] = ind;
        for(int j = 0 ; j < (int)G[nod].size() ; ++j )
            if(!r[G[nod][j]])
            {
                l[nod] = G[nod][j];
                r[G[nod][j]] = nod;
                return 1;
            }
        for(int j = 0 ; j < (int)G[nod].size() ; ++j )
            if(cuplaj(r[G[nod][j]]))
            {
                l[nod] = G[nod][j];
                r[G[nod][j]] = nod;
                return 1;
            }
        return 0;
    }