Pagini recente » katyusha | Diferente pentru planificare intre reviziile 95 si 94 | Cod sursa (job #1207636) | Monitorul de evaluare | Cod sursa (job #1118087)
#include<cstdio>
#include<vector>
#include<cstring>
#define pb push_back
#define N_MAX 10010
using namespace std;
vector <int> G[N_MAX];
bool used[N_MAX];
int M1[N_MAX],M2[N_MAX],N;
inline void Write_Sol(int N)
{
int NR=0;
for (int i=1;i<=N;++i) if (M1[i]) NR++;
printf("%d\n",NR);
for (int i=1;i<=N;++i) if (M1[i]) printf("%d %d\n",i,M1[i]);
}
inline int Find_Match(int nod)
{
if (used[nod]) return 0;
used[nod]=true;
for (vector <int> :: iterator it=G[nod].begin();it!=G[nod].end();++it)
if (!M2[*it]) {M1[nod]=*it; M2[*it]=nod; return 1;}
for (vector <int> :: iterator it=G[nod].begin();it!=G[nod].end();++it)
if (Find_Match(M2[*it])) {M1[nod]=*it; M2[*it]=nod; return 1;}
return 0;
}
inline void Solve(int OK,int N)
{
if (!OK) return;
int ok=0;
memset(used,false,sizeof(used));
for (int i=1;i<=N;++i)
if (!M1[i]) ok+=Find_Match(i);
Solve(ok,N);
}
inline void Load_Data(int &N)
{
int M,E,x,y;
scanf("%d%d%d",&N,&M,&E);
for (int i=1;i<=E;++i)
scanf("%d%d",&x,&y), G[x].pb(y);
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
Load_Data(N);
Solve(1,N);
Write_Sol(N);
fclose(stdin); fclose(stdout);
return 0;
}