Pagini recente » Cod sursa (job #516310) | Diferente pentru utilizator/iloveloona intre reviziile 3 si 2 | Profil Ruxandra985 | Cod sursa (job #2566999) | Cod sursa (job #1993123)
#include<bits/stdc++.h>
#define maxN 10005
using namespace std;
bool seen[maxN];
int l[maxN],r[maxN],x,y,augment,n,m,e;
vector<int> v[maxN];
inline int path(int nod)
{
if(seen[nod]) return 0;
seen[nod]=1;
for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
{
if(!r[*it])
{
l[nod]=*it;
r[*it]=nod;
return 1;
}
}
for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
{
if(path(r[*it]))
{
l[nod]=*it;
r[*it]=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",&x,&y);
v[x].push_back(y);
}
augment=1;
while(augment)
{
augment=0;
memset(seen,0,sizeof(seen));
for(int i=1;i<=n;i++)
{
if(!l[i])
{
augment=augment|path(i);
}
}
}
int cuplaj=0;
for(int i=1;i<=n;i++)
{
if(l[i]) cuplaj++;
}
printf("%d\n",cuplaj);
for(int i=1;i<=n;i++)
{
if(l[i]) printf("%d %d\n",i,l[i]);
}
return 0;
}