Cod sursa(job #930883)

Utilizator PatrikStepan Patrik Patrik Data 27 martie 2013 21:06:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 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()
    {
        for(sw = 1,ind=1;sw;ind++)
        {
            sw = 0;
            for(int i = 1 ; i <= N ; ++i )
            if(!l[i])if(cuplaj(i)){sw = 1;pairs++;}
        }
    }

    void tipar()
    {
        freopen("cuplaj.out" , "w" , stdout );
        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]] || cuplaj(r[G[nod][j]]) )
            {
                l[nod] = G[nod][j];
                r[G[nod][j]] = nod;
                return 1;
            }
        return 0;
    }