Pagini recente » Cod sursa (job #962222) | Cod sursa (job #761612) | Cod sursa (job #1188338) | Cod sursa (job #1838749) | Cod sursa (job #1550516)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
unsigned N1, N2, M;
vector < vector <unsigned> > graph;
vector <bool> viz;
vector <unsigned> C;
void inPut()
{
unsigned x, y;
fin >> N1 >> N2 >> M;
graph.resize( N1 + N2 + 1 );
for ( unsigned i = 1; i <= M; ++i )
{
fin >> x >> y;
graph[x].push_back( y );
graph[ N1 + y ].push_back( x );
}
}
void outPut ()
{
unsigned i;
for ( i = 1; i <= N1; ++i )
{
if ( C[i] != 0 )
{
if ( C[i] > N1 )
{
fout << i << " " << C[i] - N1 << '\n';
continue;
}
fout << i << " " << C[i] << '\n';
}
}
}
void init ( bool Init )
{
unsigned i;
for ( i = 0; i <= viz.size(); ++i )
viz[i] = Init;
}
bool dfs ( int x )
{
viz[x] = true;
unsigned j;
for ( j = 0; j < graph[x].size(); ++j )
{
int k = graph[x][j] + N1;
if ( viz[k] || C[x] == k )
{
viz[k] = true;
continue;
}
if ( C[k] == 0 )
{
viz[k] = true;
C[k] = x;
C[x] = k;
return 1;
}
else
{
viz[k] = 1;
if ( dfs( C[k] ) )
{
C[x] = k;
C[k] = x;
return 1;
}
else
continue;
}
}
return 0;
}
int main()
{
inPut();
viz.resize( N1 + N2 + 1, false );
C.resize( N1 + N2 + 1 );
unsigned i, ans = 0;
bool ok = true;
while ( ok )
{
ok = false;
init( false );
for ( i = 1; i <= N1; ++i )
if ( viz[i] == false && C[i] == 0 )
if ( dfs( i ) )
ok = true;
}
for ( i = 1; i <= N1; ++i )
if ( C[i] > 0 )
++ans;
fout << ans << '\n';
outPut();
return 0;
}