Pagini recente » Cod sursa (job #2793437) | Cod sursa (job #1471320) | Cod sursa (job #2177812) | Cod sursa (job #1044679) | Cod sursa (job #279189)
Cod sursa(job #279189)
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
#define INPUT "cuplaj.in"
#define OUTPUT "cuplaj.out"
#define VI vector<int>
#define pb push_back
#define CL(X) memset(X, 0, sizeof(X))
const int NMAX = 10001;
FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");
int N, M;
long K;
int Left[ NMAX ], Right[ NMAX ], V[ NMAX ];
VI List[ NMAX ];
void readData()
{
int Node1, Node2;
fscanf(fin, "%d %d %ld", &N, &M, &K);
for(;K--;)
{
fscanf(fin, "%d %d", &Node1, &Node2);
List[ Node1 ].pb(Node2);
}
}
int pereche(int _X)
{
if(V[ _X ]) return 0;
V[ _X ] = 1;
VI::iterator it;
for(it = List[ _X ].begin(); it != List[ _X ].end(); ++it)
if(!Right[ *it ]) { Left[ _X ] = *it, Right[ *it ] = _X; return 1; }
for(it = List[ _X ].begin(); it != List[ _X ].end(); ++it)
if(pereche(Right[ *it ])) { Left[ _X ] = *it, Right[ *it ] = _X; return 1; }
return 0;
}
void solve()
{
int ok = 1;
int cuplaj = 0;
while(ok)
{
ok = 0;
CL(V);
for(int i = 1; i <= N; ++i)
if(!Left[ i ]) ok |= pereche(i);
}
for(int i = 1; i <= N; ++i)
cuplaj += (Left[ i ] > 0) ? 1 : 0;
fprintf(fout, "%d\n", cuplaj);
for(int i = 1; i <= N; ++i)
if(Left[ i ])
fprintf(fout, "%d %d\n", i, Left[ i ]);
}
int main()
{
readData();
solve();
fclose(fin);
fclose(fout);
return 0;
}