Pagini recente » Cod sursa (job #429475) | Cod sursa (job #2399572) | Cod sursa (job #2344962) | Cod sursa (job #540571) | Cod sursa (job #614336)
Cod sursa(job #614336)
#include <fstream>
#include <vector>
#include <cstring>
#define max_n 10001
using namespace std;
int n1,n2,e,nr,i,x,y,ln;
vector <int> g[max_n];
bool ok[max_n];
int st[max_n],dr[max_n];
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int cupleaza(int x) {
int i;
vector <int>::iterator it;
if (ok[x]) return 0;
ok[x]=true;
for (it=g[x].begin(); it!=g[x].end(); it++) {
i=*it;
if (!dr[i]) {
st[x]=i;
dr[i]=x;
return 1;
}
}
for (it=g[x].begin(); it!=g[x].end(); it++) {
i=*it;
if (cupleaza(dr[i])) {
st[x]=i;
dr[i]=x;
return 1;
}
}
return 0;
}
/*
void solve() {
int i;
for (i=1; i<=n1; i++) {
if (!st[i]) {
if (cupleaza(i)) nr++;
else {
memset(ok,false,sizeof(ok));
if (cupleaza(i)) nr++;
}
}
}
}
*/
int main () {
in >> n1 >> n2 >> e;
for (i=1; i<=e; i++) {
in >> x >> y;
g[x].push_back(y);
}
memset(st,0,sizeof(st));
memset(dr,0,sizeof(dr));
memset(ok,false,sizeof(ok));
nr=0;
ln=1;
while (ln)
{
ln=0;
memset(ok,false,sizeof(ok));
for (i=1; i<=n1; i++)
if (!st[i]) ln+=cupleaza(i);
}
for (i=1; i<=n1; i++)
if (st[i]>0) nr++;
out << nr << '\n';
for (i=1; i<=n1; i++)
if (st[i]>0) out << i << ' ' << st[i] << '\n';
return 0;
}