Pagini recente » Cod sursa (job #2817346) | Cod sursa (job #3227273) | Cod sursa (job #822290) | Cod sursa (job #2326160) | Cod sursa (job #2698427)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 20000
#define f first
#define s second
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n1, n2, m, viz[NMAX+10], ans;
vector <pair <pair <int, int> , int> > nod[NMAX+10];
pair <int, int> p[NMAX+10];
queue <int> Q;
int addFlow()
{ for(int i=0; i<=n1+n2+1; i++)
p[i] = {0, 0}, viz[i] = 0;
while(!Q.empty())
Q.pop();
viz[0] = 1;
Q.push(0);
while(!Q.empty())
{ int a = Q.front();
Q.pop();
for(int i=0; i<nod[a].size(); i++)
if(nod[a][i].f.s && !viz[nod[a][i].f.f])
{ p[nod[a][i].f.f] = {a, i};
viz[nod[a][i].f.f] = 1;
if(nod[a][i].f.f == n1 + n2 + 1) return 1;
Q.push(nod[a][i].f.f);
}
}
return 0;
}
int main()
{
fin >> n1 >> n2 >> m;
for(int i=1; i<=m; i++)
{ int nod1, nod2;
fin >> nod1 >> nod2;
nod2 += n1;
nod[nod1].push_back({{nod2, 1}, nod[nod2].size()});
nod[nod2].push_back({{nod1, 1}, nod[nod1].size()-1});
}
for(int i=1; i<=n1; i++)
{ nod[0].push_back({{i, 1}, nod[i].size()});
nod[i].push_back({{0, 0}, nod[0].size()-1});
}
for(int i=n1+1; i<=n1+n2; i++)
{ nod[i].push_back({{n1+n2+1, 1}, nod[n1+n2+1].size()});
nod[n1+n2+1].push_back({{i, 0}, nod[i].size()-1});
}
while(addFlow())
{ ans++;
int curr = n1 + n2 + 1;
while(curr)
{ int pr = p[curr].f, p1 = p[curr].s, p2 = nod[pr][p1].s;
nod[pr][p1].f.s--;
nod[curr][p2].f.s++;
curr = pr;
}
}
fout << ans << '\n';
for(int i=1; i<=n1; i++)
{ for(int j=0; j<nod[i].size()-1; j++)
if(!nod[i][j].f.s)
fout << i << ' ' << nod[i][j].f.f - n1 << '\n';
}
return 0;
}