Pagini recente » Cod sursa (job #190672) | Cod sursa (job #1909108) | Cod sursa (job #548134) | Cod sursa (job #839267) | Cod sursa (job #2288381)
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");
const int NMAX = 10005;
const int EMAX = 100005;
short F[EMAX];
bool C[EMAX];
vector < pair<short, int> > G[NMAX];
int n, m, e;
queue <short> Q;
bool viz[NMAX];
short p[NMAX];
vector < pair<short, short> > muchiiRez;
int k;
int ce[NMAX * 3];
int opus[EMAX];
int bfs()
{
memset(viz, 0, sizeof(viz));
memset(p, 0, sizeof(p));
memset(ce, 0, sizeof(ce));
while (!Q.empty())
Q.pop();
Q.push(1);
viz[1] = 1;
while (!Q.empty())
{
int curr = Q.front();
Q.pop();
for (auto v: G[curr])
{
int nod = v.first;
int nrm = v.second;
if (F[nrm] != C[nrm] && !viz[nod])
{
p[nod] = curr;
ce[nod] = nrm; /// cu asta mergem inapoi
Q.push(nod);
viz[nod] = 1;
if (nod == n + m + 2)
return 1;
}
}
}
return viz[n + m + 2];
}
int main()
{
fi >> n >> m >> e;
for (int i = 1; i <= e; i++)
{
int u, v;
fi >> u >> v;
v += n;
u++;
v++;
G[u].pb({v, ++k});
C[k] = 1;
G[v].pb({u, ++k});
opus[k] = k - 1;
opus[k - 1] = k;
}
for (int i = 2; i <= n + 1; i++)
{
G[1].pb({i, ++k});
C[k] = 1;
G[i].pb({1, ++k});
opus[k] = k - 1;
opus[k - 1] = k;
}
for (int i = n + 2; i <= n + m + 1; i++)
{
G[i].pb({n + m + 2, ++k});
C[k] = 1;
G[n + m + 2].pb({i, ++k});
opus[k] = k - 1;
opus[k - 1] = k;
}
int rez = 0;
while (bfs())
{
int minim = 100;
for (int i = n + m + 2; i != 1; i = p[i])
{
minim = min(minim, C[ce[i]] - F[ce[i]]);
}
for (int i = n + m + 2; i != 1; i = p[i])
{
F[ce[i]] += minim;
F[opus[ce[i]]] -= minim;
}
rez += minim;
}
fo << rez << "\n";
for (int i = 2; i <= n + 1; i++)
{
for (auto v: G[i])
{
if (C[v.second] == F[v.second] && C[v.second] == 1)
fo << i - 1 << " " << v.first - (n + 1) << "\n";
}
}
return 0;
}