Pagini recente » Cod sursa (job #70564) | Cod sursa (job #2433769) | Cod sursa (job #1984025) | Cod sursa (job #812640) | Cod sursa (job #1311283)
#include <fstream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std ;
const int NMAX = 10000005 ;
const int INF = 0x3f3f3f3f;
ifstream fin("cuplaj.in") ;
ofstream fout("cuplaj.out") ;
int N, M, E, cuplaj;
vector <int> G[NMAX] ;
int L[NMAX], r[NMAX], u[NMAX] ;
///#########################################################
inline void READ()
{
fin >> N >> M >> E ;
for(int i = 1 ; i <= E ; ++ i)
{
int x, y ;
fin >> x >> y;
G[x].push_back(y) ;
}
}
///#########################################################
inline int pairup(const int n)
{
if(u[n])
return 0 ;
u[n] = 1 ;
for(vector <int> ::iterator it = G[n].begin() ; it != G[n].end() ; ++ it)
if(!r[*it])
{
L[n] = *it ;
r[*it] = n ;
return 1 ;
}
for(vector <int> ::iterator it = G[n].begin() ; it != G[n].end() ; ++ it)
if(pairup(r[*it]))
{
L[n] = *it ;
r[*it] = n ;
return 1 ;
}
return 0 ;
}
///#########################################################
inline void SOLVE()
{
for(int ok = 1 ; ok;)
{
ok = 0 ;
memset(u, 0, sizeof(u)) ;
for(int i = 1 ; i <= N ; ++ i)
if(!L[i])
ok |= pairup(i) ;
}
for(int i = 1 ; i <= N ; ++ i)
cuplaj = cuplaj + (L[i] > 0) ;
}
///#########################################################
inline void OUT()
{
fout << cuplaj << '\n' ;
for(int i = 1 ; i <= N ; ++i)
if(L[i] > 0)
fout << i << ' ' << L[i] << '\n' ;
}
///#########################################################
int main()
{
READ() ;
SOLVE() ;
OUT() ;
fin.close() ;
fout.close() ;
return 0 ;
}