Pagini recente » Cod sursa (job #647543) | Cod sursa (job #2008189) | Cod sursa (job #1085232) | Cod sursa (job #205725) | Cod sursa (job #3266223)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n, m, s, t, e;
vector<vector<int>> la;
vector<vector<int>> capacitate, flux;
vector<int> tata;
void Read()
{
f >> n >> m >> e;
s = 0; // sursa
t = n + m + 1; // destinația
la.resize(n + m + 2);
capacitate.resize(n + m + 2, vector<int>(n + m + 2, 0));
flux.resize(n + m + 2, vector<int>(n + m + 2, 0));
tata.resize(n + m + 2, -1);
int x, y;
for (int i = 1; i <= e; i++)
{
f >> x >> y;
la[x].push_back(n + y);
la[n + y].push_back(x);
capacitate[x][n + y] = 1;
}
for (int i = 1; i <= n; i++)
{
la[s].push_back(i);
la[i].push_back(s);
capacitate[s][i] = 1;
}
for (int i = 1; i <= m; i++)
{
la[n + i].push_back(t);
la[t].push_back(n + i);
capacitate[n + i][t] = 1;
}
}
bool ConstruiesteDrumBF()
{
vector<bool> viz(n + m + 2, false);
queue<int> q;
q.push(s);
viz[s] = true;
tata.assign(n + m + 2, -1);
while (!q.empty())
{
int nod = q.front();
q.pop();
for (int vecin : la[nod])
{
if (!viz[vecin] && capacitate[nod][vecin] > flux[nod][vecin])
{
q.push(vecin);
viz[vecin] = true;
tata[vecin] = nod;
if (vecin == t)
return true;
}
}
}
return false;
}
int main()
{
Read();
int flow = 0;
while (ConstruiesteDrumBF())
{
int fmin = INT_MAX;
for (int nod = t; nod != s; nod = tata[nod])
{
fmin = min(fmin, capacitate[tata[nod]][nod] - flux[tata[nod]][nod]);
}
for (int nod = t; nod != s; nod = tata[nod])
{
flux[tata[nod]][nod] += fmin;
flux[nod][tata[nod]] -= fmin;
}
flow += fmin;
}
g << flow << '\n';
for (int u = 1; u <= n; u++)
{
for (int v : la[u])
{
if (flux[u][v] == 1)
{
g << u << ' ' << v - n << '\n';
}
}
}
return 0;
}