Pagini recente » Cod sursa (job #842264) | Cod sursa (job #166934) | Cod sursa (job #1764559) | Cod sursa (job #3176572) | Cod sursa (job #2966942)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
struct Edge {
int x, y, cap, poz;
};
int n, m, e, s, t;
vector <Edge> edges;
vector <vector<int>> v;
vector <int> tata;
vector <bool> visited;
void addEdge(int x, int y) {
int dim = edges.size();
v[x].push_back(dim);
v[y].push_back(dim + 1);
edges.push_back({x, y, 1, dim + 1});
edges.push_back({y, x, 0, dim});
}
bool bfs() {
fill(visited.begin(), visited.end(), 0);
queue <int> q;
q.push(s);
visited[s] = true;
int node;
while(!q.empty()) {
node = q.front();
q.pop();
if(node == t)
continue;
for(const auto& i : v[node]) {
auto edge = edges[i];
if(!visited[edge.y] && edge.cap) {
tata[edge.y] = i;
visited[edge.y] = true;
q.push(edge.y);
}
}
}
return visited[t];
}
int getMaxFlow() {
int F = 0;
while(bfs()) {
for(const auto& i : v[t]) {
if(!visited[edges[i].y])
continue;
auto edge = edges[i];
tata[t] = edge.poz;
int minFlow = 2e9;
for (int node = t; node != s; node = edges[tata[node]].x) {
if (edges[tata[node]].cap < minFlow)
minFlow = edges[tata[node]].cap;
}
if(minFlow == 0)
continue;
F += minFlow;
for (int node = t; node != s; node = edges[tata[node]].x) {
edges[tata[node]].cap -= minFlow;
edges[edges[tata[node]].poz].cap += minFlow;
}
}
}
return F;
}
int main() {
v = vector <vector<int>> (n + m + 2);
tata = vector <int> (n + m + 2);
visited = vector <bool> (n + m + 2);
fin >> n >> m >> e;
t = n + m + 1;
int x, y;
for(int i = 1; i <= e; i ++) {
fin >> x >> y;
addEdge(x, y + n);
}
//cream muchii intre sursa si nodurile din partea stanga a grafului bip
for(int i = 1; i <= n; i ++)
addEdge(s, i);
// cream muchii din partea stanga a grafului bipartit catre dreapta
for(int i = n + 1; i <= n + m; i ++)
addEdge(i, n + m + 1);
fout << getMaxFlow() << '\n';
for(auto edge : edges)
if(edge.x < edge.y && edge.x != s && edge.y != t && edge.cap == 0)
fout << edge.x << " " << edge.y - n << '\n';
return 0;
}