Pagini recente » Cod sursa (job #1860969) | Cod sursa (job #3183569) | Cod sursa (job #480070) | Cod sursa (job #1032974) | Cod sursa (job #930849)
Cod sursa(job #930849)
#include<cstdio>
#include<vector>
using namespace std;
#define MAX 10001
#define pb push_back
int N , M ,E , l[MAX] , r[MAX] , pairs , ind , viz[MAX];
bool sw;
vector<int> G[MAX] ;
void citire();
void solve();
void tipar();
bool cuplaj(int nod);
int main()
{
citire();
solve();
tipar();
return 0;
}
void citire()
{
int x , y ;
freopen("cuplaj.in" , "r" , stdin );
scanf("%d%d%d" , &N , &M , &E);
for(int i = 1 ; i <= E ; ++i )
{
scanf("%d%d" , &x , &y);
G[x].pb(y);
}
}
void solve()
{
do
{
ind++;
sw = 0;
for(int i = 1 ; i <= N ; ++i )
if(!l[i])
sw = (sw || cuplaj(i));
}while(sw);
}
void tipar()
{
freopen("cuplaj.out" , "w" , stdout );
for(int i = 1 ; i <= N ; ++i )if(l[i])pairs++;
printf("%d\n" , pairs);
for(int i = 1 ; i <= N ; ++i )
if(l[i])printf("%d %d\n" , i , l[i]);
}
bool cuplaj(int nod)
{
if(viz[nod]==ind)return 0;
viz[nod] = ind;
for(int j = 0 ; j < (int)G[nod].size() ; ++j )
if(!r[G[nod][j]])
{
l[nod] = G[nod][j];
r[G[nod][j]] = nod;
return 1;
}
for(int j = 0 ; j < (int)G[nod].size() ; ++j )
if(cuplaj(r[G[nod][j]]))
{
l[nod] = G[nod][j];
r[G[nod][j]] = nod;
return 1;
}
return 0;
}