Pagini recente » Cod sursa (job #3276094) | Cod sursa (job #277661) | Cod sursa (job #1904180) | Cod sursa (job #892659) | Cod sursa (job #497038)
Cod sursa(job #497038)
#include<stdio.h>
#include<vector>
#define N 1<<14
using namespace std;
int n,m,e,a,b,i,cd[N],ci[N],viz[N],cuplaje,creste(int ic);
vector<int> v[N];
void read(),solve();
int main()
{ read();
solve();
return 0;
}
void read()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d%d%d",&n,&m,&e);
for(i=1;i<=e;i++)
{
scanf("%d%d",&a,&b);
v[a].push_back(b);
}
}
void solve()
{
int gata=0;
for(;!gata;)
{
gata=1;
for(i=1;i<=n;i++)viz[i]=0;
for(i=1;i<=n;i++)
if(!cd[i]&&creste(i))
{
gata=0;
cuplaje++;
}
}
printf("%d\n",cuplaje);
for(i=1;i<=n;i++)
if(cd[i])printf("%d %d\n",i,cd[i]);
}
int creste(int ic)
{
if (viz[ic]) return 0;
vector<int>::iterator it;
viz[ic] = 1;
for(it=v[ic].begin();it!=v[ic].end();it++)
if (!ci[*it]){ci[*it]=ic;cd[ic]=*it;return 1;}
for(it=v[ic].begin();it!=v[ic].end();it++)
if (creste(ci[*it])){ci[*it]=ic;cd[ic]=*it;return 1;}
return 0;
}