Pagini recente » Cod sursa (job #274142) | Cod sursa (job #1727729) | Cod sursa (job #39858) | Cod sursa (job #3282882) | Cod sursa (job #2387043)
#include <bits/stdc++.h>
#define maxn 20000
#define pb push_back
#define pii pair<int,int>
#define fi first
#define se second
#define inf INT_MAX/2-1
using namespace std;
vector <int> g[maxn+5];
map <pii,char> _cap;
map <pii,char> _flx;
vector <int> way;
vector <pii> cup;
bool viz[maxn+5];
int flux;
int l, r;
void _reset ( int n ) { for ( int i = 0; i < n; i++ ) viz[i] = 0; }
void dfs ( int nod )
{
viz[nod] = 1; way.pb (nod);
if ( nod == l + r + 1 ) { flux = 1; return; }
int i, sz = g[nod].size(), nn;
for ( i = 0; i < sz && flux == 0; i++ )
{
nn = g[nod][i];
if ( viz[nn] == 0 && _cap[{nod,nn}] > _flx[{nod,nn}] ) dfs (nn);
}
if (flux == 0) way.pop_back ();
}
int main ()
{
ifstream fin ( "cuplaj.in" );
ofstream fout ( "cuplaj.out" );
int e; fin >> l >> r >> e;
int i, j, a, b, sz;
for ( i = 0; i < e; i++ )
{
fin >> a >> b;
g[a].pb (l+b); g[l+b].pb (a);
_cap[{a,l+b}] = 1;
}
for ( i = 1; i <= l; i++ ) g[i].pb (0), g[0].pb (i), _cap[{0,i}] = 1;
for ( i = l + 1; i <= l+r; i++ ) g[i].pb (l+r+1), g[l+r+1].pb (i), _cap[{i,l+r+1}] = 1;
dfs (0);
while (flux == 1)
{
sz = way.size();
for ( i = 0; i < sz-1; i++ ) _flx[{way[i],way[i+1]}]++, _flx[{way[i+1],way[i]}]--;
_reset (l+r+2); way.clear();
flux = 0; dfs (0);
}
for ( i = 1; i <= l; i++ )
for ( j = 0; j < g[i].size(); j++ )
if ( g[i][j] > 0 && _flx[{i,g[i][j]}] == 1 )
cup.pb ( {i,g[i][j]-l} );
sz = cup.size();
fout << sz << '\n';
for ( i = 0; i < sz; i++ ) fout << cup[i].fi << ' ' << cup[i].se << '\n';
fin.close ();
fout.close ();
return 0;
}