Cod sursa(job #1758144)

Utilizator din99danyMatei Daniel din99dany Data 16 septembrie 2016 17:15:48
Problema Cuplaj maxim in graf bipartit Scor 18
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

#define NMAX 10005

int degA[ NMAX ],
    degB[ NMAX ],
    vizt[ NMAX ],
    ordi[ NMAX ],
    peri[ NMAX ];

vector < int > v[ NMAX ];

bool cmp1( int a, int b );
bool cmp2( int a, int b );

int main()
{

    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);

    int n, m, i, j, x, y, a, b, s;
    s = 0;

    scanf("%d%d%d",&a,&b,&m);
    while( m-- ){
        scanf("%d%d",&x,&y);
        v[ x ].push_back( y );
        degA[ x ]++;
        degB[ y ]++;
    }

    for( i = 1; i <= a; ++i ){
        sort( v[ i ].begin(), v[ i ].end(), cmp2 );
        ordi[ i ] = i;
    }

    sort( ordi + 1, ordi + 1 + a, cmp1 );

    for( i = 1; i <= a; ++i ){
        for( j = 0; j < v[ ordi[ i ] ].size(); ++j ){
            if( !vizt[ v[ ordi[ i ] ][ j ] ] ){
                s++;
                peri[ ordi[ i ] ] = v[ ordi[ i ] ][ j ];
                vizt[ v[ ordi[ i ] ][ j ] ] = 1;
            }
        }
    }

    printf("%d\n",s);
    for( i = 1; i <= a; ++i ){
        if( peri[ i ] ) printf("%d %d\n",i,peri[ i ]);
    }

    return 0;

}

bool cmp1( int a, int b ){
    return degA[ a ] < degA[ b ];
}

bool cmp2( int a, int b ){
    return degB[ a ] < degB[ b ];
}