Pagini recente » Cod sursa (job #2347451) | Cod sursa (job #764962) | Cod sursa (job #1901993) | Cod sursa (job #2802065) | Cod sursa (job #18553)
Cod sursa(job #18553)
#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 );
}