Pagini recente » Cod sursa (job #1827936) | Cod sursa (job #1554334) | Cod sursa (job #2758706) | Cod sursa (job #2080266) | Cod sursa (job #985052)
Cod sursa(job #985052)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#define Nmax 10005
vector <int> G[Nmax];
int st[Nmax], dr[Nmax];
char use[Nmax];
int N, M, E, nr;
int inverted;
void read()
{
ifstream f("cuplaj.in");
f >> N >> M >> E;
if ( M > N )
{
inverted = 1;
}
for ( int i = 1, a, b; i <= E; ++i )
{
f >> a >> b;
if ( inverted )
G[b].push_back( a );
else
G[a].push_back( b );
}
f.close();
}
int cupleaza( int nod )
{
if ( use[nod] )
return 0;
use[nod] = 1;
for ( unsigned i = 0; i < G[nod].size(); ++i )
{
if ( !dr[ G[nod][i] ] || cupleaza( dr[ G[nod][i] ] ) )
{
st[nod] = G[nod][i];
dr[ G[nod][i] ] = nod;
return 1;
}
}
return 0;
}
void cuplaj()
{
if ( inverted )
{
for ( int i = 1; i <= M; ++i )
{
if ( st[i] )
continue;
if ( cupleaza( i ) )
nr++;
else
{
fill( use, use + Nmax, 0 );
if ( cupleaza( i ) )
nr++;
}
}
}
else
{
for ( int i = 1; i <= N; ++i )
{
if ( st[i] )
continue;
if ( cupleaza( i ) )
nr++;
else
{
fill( use, use + Nmax, 0 );
if ( cupleaza( i ) )
nr++;
}
}
}
}
void print()
{
ofstream g("cuplaj.out");
g << nr << '\n';
if ( inverted )
{
for ( int i = 1; i <= M; ++i )
if ( st[i] )
g << st[i] << " " << i << '\n';
}
else
{
for ( int i = 1; i <= N; ++i )
if ( st[i] )
g << i << " " << st[i] << '\n';
}
g.close();
}
int main()
{
read();
cuplaj();
print();
return 0;
}