Pagini recente » Cod sursa (job #3235102) | Cod sursa (job #3180379) | Cod sursa (job #3279026) | Borderou de evaluare (job #1004061) | Cod sursa (job #3270388)
#include <iostream>
#include <vector>
#define NMAX 10000
using namespace std;
FILE *in=fopen("cuplaj.in", "r"), *out=fopen("cuplaj.out", "w");
int n, m, p, x, y, nm, mx;
vector<int> adc[NMAX+2];
vector<bool> us;
vector<int> mt;
vector<int> l;
bool kuhn(int v)
{
if(us[v]==1)
return 0;
us[v]=1;
for(auto it : adc[v])
{
if(mt[it]==-1 || kuhn(mt[it]))
{
mt[it]=v;
l[v]=it;
return 1;
}
}
return 0;
}
int main()
{
fscanf(in, "%d %d %d", &n, &m, &p);
for(int i=1; i<=p; i++)
{
fscanf(in, "%d %d", &x, &y);
y += n;
adc[x].push_back(y);
}
bool change = 1;
mt.assign(n+m+1, -1);
l.assign(n+m+1, -1);
while(change)
{
change = 0;
us.assign(n+m+1, 0);
for(int i=1; i<=n; i++)
{
if(l[i] == -1)
change |= kuhn(i);
}
}
int cp = 0;
for(int i=1; i<=n; i++) cp += (l[i] > 0);
fprintf(out, "%d\n", cp);
for(int i=1; i<=n; i++)
if(l[i] > 0)
fprintf(out, "%d %d\n", i, l[i]);
}