Pagini recente » Cod sursa (job #833776) | Cod sursa (job #2080186) | Cod sursa (job #670994) | Cod sursa (job #589811) | Cod sursa (job #305229)
Cod sursa(job #305229)
#include<cstdio>
#include<vector>
#include<string>
using namespace std;
#define MAX_N 10003
vector<int>A[MAX_N];
int N,M,E;
int viz[MAX_N];
int stanga[MAX_N], dreapta[MAX_N];
void read()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d%d%d",&N,&M,&E);
int i,x,y;
for(i=1;i<=E;++i)
{
scanf("%d%d",&x,&y);
A[x].push_back(y);
}
}
inline bool pairUp(int x)
{
if(viz[x]) return 0;
viz[x] = 1;
int i, y;
for(i=0; i<A[x].size(); ++i)
{
y = A[x][i];
if(!stanga[y])
{
stanga[y] = x;
dreapta[x] = y;
return 1;
}
}
for(i=0; i<A[x].size(); ++i)
{
y = A[x][i];
if(pairUp(stanga[y]))
{
stanga[y] = x;
dreapta[x] = y;
return 1;
}
}
return 0;
}
void solve()
{
int i,ok;
for(ok = 1; ok; )
{
ok = 0;
memset(viz,0,sizeof(viz));
for(i=1;i<=N;++i)
if(!dreapta[i]) ok |= pairUp(i);
}
int sol = 0;
for(i=1;i<=N;++i) if(dreapta[i]) sol++;
printf("%d\n",sol);
for(i=1;i<=N;++i) if(dreapta[i]) printf("%d %d\n",i,dreapta[i]);
}
int main()
{
read();
solve();
return 0;
}