Pagini recente » Cod sursa (job #726531) | Cod sursa (job #216050) | Cod sursa (job #1298978) | Cod sursa (job #1044359) | Cod sursa (job #1625225)
#include <fstream>
#include <cstring>
#include <vector>
#define Nmax 10100
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector<int> A[Nmax];
vector<int> B[Nmax];
int MachingA[Nmax];
int MachingB[Nmax];
int i,a,nA,b,nB,m,Max;
bool viz[Nmax];
bool DFS(int i)
{
for(int j=0; j<A[i].size(); j++)
{
if(!viz[A[i][j]])
{
if(MachingB[A[i][j]])
{
viz[A[i][j]]=1;
if(DFS(MachingB[A[i][j]]))
{
MachingA[i]=A[i][j];
MachingB[A[i][j]]=i;
return 1;
}
}
else
{
MachingA[i]=A[i][j];
MachingB[A[i][j]]=i;
return 1;
}
}
}
return 0;
}
bool DFS2(int i)
{
for(int j=0; j<B[i].size(); j++)
{
if(!viz[B[i][j]])
{
if(MachingA[B[i][j]])
{
viz[B[i][j]]=1;
if(DFS2(MachingA[B[i][j]]))
{
MachingB[i]=B[i][j];
MachingA[B[i][j]]=i;
return 1;
}
}
else
{
MachingB[i]=B[i][j];
MachingA[B[i][j]]=i;
return 1;
}
}
}
return 0;
}
bool Exist()
{
Max++;
memset(viz,0,sizeof(viz));
for(i=1; i<=nA; i++)
if(!MachingA[i] && !viz[i])
{
if(DFS(i))
return 1;
}
memset(viz,0,sizeof(viz));
for(i=1; i<=nB; i++)
if(!MachingB[i] && !viz[i])
{
if(DFS2(i))
return 1;
}
Max--;
return 0;
}
void Gready()
{
for(i=1;i<=nA;i++)
{
for(int j=0;j<A[i].size();j++)
{
if(!MachingB[A[i][j]])
{
MachingB[A[i][j]]=i;
MachingA[i]=A[i][j];
Max++;
}
}
}
}
void solve()
{
Gready();
while(Exist());
}
int main()
{
fin>>nA>>nB>>m;
for(i=1; i<=m; i++)
{
fin>>a>>b;
A[a].push_back(b);
B[b].push_back(a);
}
solve();
fout<<Max<<'\n';
for(i=1; i<=nB; i++)
if(MachingB[i])
fout<<MachingB[i]<<' '<<i<<'\n';
return 0;
}