Pagini recente » Cod sursa (job #685971) | Cod sursa (job #607417) | Cod sursa (job #2248718) | Cod sursa (job #2612223) | Cod sursa (job #1549780)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
unsigned N1, N2, M;
vector < vector <int> > graf1;
vector <bool> viz;
vector <int> C;
void read()
{
int x, y;
fin >> N1 >> N2 >> M;
graf1.resize( N1 + N2 + 1 );
for ( unsigned i = 1; i <= M; ++i )
{
fin >> x >> y;
graf1[x].push_back( y );
graf1[ N1 + y ].push_back( x );
}
}
void afisare ()
{
unsigned i;
for ( i = 1; i <= N1; ++i )
{
if ( C[i] != -1 )
{
if ( C[i] > N1 )
{
fout << i << " " << C[i] - N1 << '\n';
continue;
}
fout << i << " " << C[i] << '\n';
}
}
}
void match ( int x, bool nrGraph )
{
viz[x] = true;
unsigned i;
for ( i = 0; i < graf1[x].size(); ++i)
{
if ( !viz[ nrGraph * N1 + graf1[x][i] ] )
{
if ( C[x] == -1 && C[nrGraph * N1 + graf1[x][i]] == -1 )
{
C[x] = nrGraph * N1 + graf1[x][i];
C[nrGraph * N1 + graf1[x][i]] = x;
match ( graf1[x][i] + nrGraph * N1, !nrGraph );
}
else
match ( graf1[x][i] + nrGraph * N1, !nrGraph );
}
}
}
void init ( bool Init )
{
unsigned i;
for ( i = 0; i <= viz.size(); ++i )
viz[i] = Init;
}
int dfs ( int x, bool nrGraph )
{
viz[x] = true;
unsigned j;
for ( j = 0; j < graf1[x].size(); ++j )
{
int k = graf1[x][j] + N1 * nrGraph;
if ( viz[k] || C[x] == k )
{
viz[k] = true;
continue;
}
if ( C[k] == -1 )
{
viz[k] = true;
C[k] = x;
C[x] = k;
return 1;
}
else
{
viz[k] = 1;
if ( dfs( C[k], nrGraph ) )
{
C[x] = k;
C[k] = x;
return 1;
}
else
continue;
}
}
return 0;
}
int main()
{
read();
viz.resize( N1 + N2 + 1, false );
C.resize( N1 + N2 + 1, -1 );
match ( 1, true );
init ( false );
unsigned i, ans = 0;
bool ok = true;
while ( ok )
{
ok = false;
for ( i = 1; i <= N1; ++i )
if ( viz[i] || C[i] == -1 )
if ( dfs( i, true ) )
ok = true;
}
for ( i = 1; i <= N1; ++i )
if ( C[i] > -1 )
++ans;
fout << ans << '\n';
afisare();
return 0;
}