Pagini recente » Cod sursa (job #2238781) | Cod sursa (job #278432) | Cod sursa (job #374149) | Cod sursa (job #2475050) | Cod sursa (job #1676175)
#include <fstream>
#include <string.h>
#include <vector>
#include <queue>
#include <limits.h>
#define nMax 100001
#define lgMax 19
#define pb push_back
#define INF INT_MAX
#define bit(i) i&(-i)
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int L, R, m, cuplaj;
int viz[nMax], l[nMax], r[nMax];
vector<int> G[nMax];
void read()
{
int a, b;
fin>>L>>R>>m;
for(int i=1;i<=m;i++)
{
fin>>a>>b;
G[a].pb(b);
}
}
inline bool pairup(int node)
{
if(viz[node])
return 0;
viz[node]=1;
for(vector<int>::iterator it=G[node].begin();it!=G[node].end();it++)
{
int fiu=*it;
if(r[fiu]==0)
{
cuplaj++;
r[fiu]=node;
l[node]=fiu;
return 1;
}
}
for(vector<int>::iterator it=G[node].begin();it!=G[node].end();it++)
{
int fiu=*it;
if(pairup(r[fiu]))
{
r[fiu]=node;
l[node]=fiu;
return 1;
}
}
return 0;
}
void solve()
{
for(int change=1;change;)
{
change=0;
memset(viz, 0, sizeof(viz));
for(int i=1;i<=L;i++)
if(l[i]==0)
change |= pairup(i);
}
}
void write()
{
fout<<cuplaj<<'\n';
for(int i=1;i<=L;i++)
if(l[i])
fout<<i<<" "<<l[i]<<'\n';
}
int main()
{
read();
solve();
write();
return 0;
}