Pagini recente » Cod sursa (job #2657591) | Cod sursa (job #1691368) | Cod sursa (job #1331035) | Cod sursa (job #2380258) | Cod sursa (job #2701713)
#include <iostream>
#include <vector>
#include <cstring>
#include <fstream>
#include <queue>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
const int INF = 1e9 + 9;
const int dim = 2005;
vector <int> vec[dim];
int parent[dim],viz[dim],c[dim][dim],n,m,a[dim],initial[dim][dim],suma,k,e;
int BFS(int sursa,int destinatie)
{
memset(viz,0,sizeof(viz));
queue<pair<int,int> > q;
q.push({sursa, INF});
viz[sursa] = 1;
while (!q.empty())
{
pair<int,int> x = q.front();
int flow = x.second;
q.pop();
for (int j=0; j<vec[x.first].size(); j++)
{
int y = vec[x.first][j];
if (!viz[y] && c[x.first][y] > 0)
{
viz[y] = 1;
flow = min(flow, c[x.first][y]);
parent[y] = x.first;
q.push({y, flow});
if (y == destinatie) return flow;
}
}
}
return 0;
}
int Get_Flux(int sursa,int destinatie)
{
int maxflow = 0;
int flow = 0;
int ok;
while ((flow = BFS(sursa, destinatie)))
{
maxflow += flow;
int x = destinatie;
while (x != sursa)
{
int p = parent[x];
c[parent[x]][x] -= flow;
c[x][parent[x]] += flow;
x = parent[x];
}
}
return maxflow;
}
int main()
{
int x,y;
in >> n >> m >> e;
int sursa = 0;
int destinatie = n + m + 5;
for (int i=1; i<=n; i++)
{
vec[sursa].push_back(i);
vec[i].push_back(sursa);
c[sursa][i] = 1;
}
for (int i=1; i<=m; i++)
{
vec[n+i].push_back(destinatie);
vec[destinatie].push_back(n+i);
c[n+i][destinatie] = 1;
}
while (e--)
{
in >> x >> y;
vec[x].push_back(n + y);
vec[n+y].push_back(x);
c[x][n+y] = 1;
}
out << Get_Flux(sursa, destinatie) << "\n";
for (int i=1; i<=n; i++)
{
for (auto y:vec[i])
{
if (c[i][y] == 0 && y > n)
{
out << i << " " << y-n << "\n";
}
}
}
return 0;
}