Pagini recente » Cod sursa (job #976073) | Cod sursa (job #772925) | Cod sursa (job #1725436) | Cod sursa (job #1658883) | Cod sursa (job #1625279)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
long n,i,m,e,ok,viz[20005],u,v,C[20005];
vector<int> G[20005];
void cup(long nod)
{
for (int i=0;i<G[nod].size();i++)
if (C[G[nod][i]]==0)
{
C[nod]=G[nod][i];
C[G[nod][i]]=nod;
return ;
}
}
void greedy()
{
for (int i=1;i<=n+m;i++)
{
if (C[i]==0)
cup(i);
}
}
void cupleaza(long a,long b)
{
C[a]=b;
C[b]=a;
}
void decupleaza(long a)
{
C[a]=0;
}
bool dfs(long nod)
{
viz[nod]=1;
for (int i=0;i<G[nod].size();i++)
{
if (viz[G[nod][i]]==0)
{
if (C[G[nod][i]]!=0)
{
viz[G[nod][i]]=1;
if (dfs(C[G[nod][i]]))
{
decupleaza(C[nod]);
cupleaza(nod,G[nod][i]);
return 1;
}
}
else
{
decupleaza(C[nod]);
cupleaza(nod,G[nod][i]);
return 1;
}
}
}
return 0;
}
int main()
{
f>>n>>m>>e;
for (i=1;i<=e;i++)
{
f>>u>>v;
v+=n;
G[u].push_back(v);
G[v].push_back(u);
}
//greedy();
for (i=1;i<=n;i++)
{
if (C[i]==0)
{
memset(viz,0,sizeof(viz));
dfs(i);
}
}
long nr=0;
for (i=1;i<=n;i++)
if(C[i]!=0)
nr++;
g<<nr<<'\n';
for (i=1;i<=n;i++)
if (C[i]!=0)
g<<i<<' '<<C[i]-n<<'\n';
return 0;
}