Pagini recente » Cod sursa (job #3287866) | Cod sursa (job #175876) | Cod sursa (job #1659568) | Cod sursa (job #1900769) | Cod sursa (job #611412)
Cod sursa(job #611412)
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define NMAX 12000
vector< int > G[NMAX];
int L[NMAX],R[NMAX];
bool viz[NMAX];
int make_pair( int nod )
{
if( viz[nod] )
return 0; // am gasit 'recent' un corespondent pt nod
viz[nod]=1;
int i,v;
for(i=0; (unsigned)i<G[nod].size(); ++i)
{
v=G[nod][i];
if( !L[v] || make_pair( L[v] ) )
{
L[v]=nod;
R[nod]=v;
return 1; // am gasit o noua solutie
}
}
return 0; // nu am putut realiza un matching pentru $nod
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
int N1,N2,M;
scanf("%d%d%d",&N1,&N2,&M);
int a1,a2;
while( M-- )
{
scanf("%d%d",&a1,&a2);
G[a1].push_back(a2);
}
while( 1 ) // cat timp poti sa iti imbunatatesti solutia
{
memset( viz, 0, sizeof(viz) );
int i,ok=0;
for(i=1; i<=N1; ++i)
{
if( !R[i] ) // daca nodul i de pe flancul stang
// nu are corespondent pe flancul drept
ok|=make_pair(i); // caut corespondent
}
if( !ok )
break;
}
int i,ans=0;
for(i=1; i<=N1; ++i)
ans+=(R[i]!=0);
printf("%d\n",ans);
for(i=1; i<=N1; ++i)
{
if( R[i]!=0 )
printf("%d %d\n",i,R[i]);
}
return 0;
}