Cod sursa(job #18553)

Utilizator 004444Lapusan Tudor 004444 Data 18 februarie 2007 12:36:43
Problema Ghiozdan Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.86 kb
#include <stdio.h>
#define MAX 10000


typedef struct nod
{
    int x;
    nod *adr_urm;
}*pnod;

pnod l[MAX];

int t, n, m, e, flow;
int s[MAX], c1[MAX], c2[MAX];


void citire ();
void add ( int i, int j );
void solve ();
void afisare ();

int augument ();
int df ( int nod );


int main ()
{
    freopen ( "java.in", "r", stdin );
    freopen ( "java.out", "w", stdout );

    citire ();

    return 0;
}

void citire ()
{
    int i, j, x, y;

    scanf ( "%d", &t );
    for ( i = 1; i <= t; i++ )
    {
        scanf ( "%d %d %d", &n, &m, &e );
        for ( j = 1; j <= e; j++ )
        {
            scanf ( "%d %d", &x, &y );
            add ( x, y );
            
//            printf ( "%d %d\n", x, y );
        }
        solve ();
//        printf ( "\n" );
        for ( j = 1; j <= n; j++ )
            l[j] = NULL;
    }
}
            
void add ( int i, int j )
{
    pnod p = new nod;
    
    p->x = j;
    p->adr_urm = l[i];
    l[i] = p;
}

void solve ()
{
    int i;

    for ( i = 1; i <= n; i++ )
        c1[i] = -1;
    for ( i = 1; i <= m; i++ )
        c2[i] = -1;
    
    for ( flow = 0; augument (); flow++ );
        
    afisare ();
}

int augument ()
{
    int i, ind;

    for ( i = 1; i <= m; i++ )
        s[i] = 0;
        
    ind = 0;
    for ( i = 1; i <= n && !ind; i++ )
        if ( c1[i] < 0 )
            ind = df ( i );
    return ind;
}

int df ( int v )
{
    int j;
    pnod p;

    for ( p = l[v]; p; p = p->adr_urm )
    {
        j = p->x;
            
        if ( s[j] )
            continue;
        s[j] = 1;
        if ( c2[j] < 0 || df ( c2[j] ) )
        {
            c1[v] = j;
            c2[j] = v;
            return 1;
        }
    }
    return 0;
}

void afisare ()
{
    printf ( "%d\n", flow );
}