Pagini recente » Cod sursa (job #2787746) | Cod sursa (job #1920143) | Cod sursa (job #1734433) | Cod sursa (job #948645) | Cod sursa (job #1625337)
#include <fstream>
#include <cstdio>
#include <iostream>
#include <vector>
#define LGM 20005
using namespace std;
//ofstream fout("cuplaj.out");
vector<int>graf[LGM];
int pas,m,n,a,b,ok,i,j,nr,viz[LGM],c[LGM],e;
bool dfs(int nod)
{
viz[nod] = pas;
for(int i=0;i<graf[nod].size();i++)
{
if(viz[graf[nod][i]] == pas)
continue;
if(c[graf[nod][i]] != 0)
{
viz[graf[nod][i]] = pas;
if(dfs(c[graf[nod][i]]))
{
c[nod] = graf[nod][i];
c[graf[nod][i]] = nod;
return 1;
}
}
else
{
nr++;
c[nod] = graf[nod][i];
c[graf[nod][i]] = nod;
return 1;
}
}
return 0;
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d%d%d",&n,&m,&e);
for(int i=1;i<=e;i++)
{
scanf("%d%d",&a,&b);
graf[a].push_back(b+n);
graf[b+n].push_back(a);
}
ok = 1; i = a;
while(ok)
{
ok = 0;
for(j=0;j<graf[i].size();j++)
if(viz[graf[i][j]] == 0)
{
viz[graf[i][j]] = 1;
if(c[i] == 0)
c[i] = graf[i][j], c[graf[i][j]] = i, nr++;
i = graf[i][j];
ok = 1;
break;
}
}
ok = 1; pas = 1;
while(ok)
{
ok=0;
for(int i=1;i<=n;i++)
if(c[i] == 0)
{
pas++;
if(dfs(i))
ok=1;
}
}
printf("%d\n",nr);
for(int i=1;i<=n;i++)
if(c[i]!=0)
printf("%d %d\n",i,c[i]-n);
return 0;
}