Pagini recente » Cod sursa (job #2133503) | Cod sursa (job #148267) | Cod sursa (job #301505) | Cod sursa (job #2952701) | Cod sursa (job #2755416)
#include <iostream>
#include <fstream>
#include <queue>
#include <climits>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
bool BFS(int** G, int V, int s, int d, int* parent) {
bool* viz = new bool[V];
for (int i = 0; i < V; i++)
viz[i] = false;
queue<int> Q;
Q.push(s);
parent[s] = -1;
viz[s] = true;
while (!Q.empty()) {
int u = Q.front();
Q.pop();
for (int v = 0; v < V; v++) {
if (viz[v] == false && G[u][v] > 0)
{
Q.push(v);
parent[v] = u;
viz[v] = true;
}
}
}
if (viz[d] == true) {
delete[] viz;
return true;
}
delete[] viz;
return false;
}
int Ford_Fulkerson(int** G, int& V, int s, int d) {
int u, v;
int** rG; // graf rezidual
rG = new int* [V];
for (int i = 0; i < V; i++)
rG[i] = new int[V];
for (u = 0; u < V; u++)
for (v = 0; v < V; v++)
rG[u][v] = G[u][v];
//
int* parent = new int[V];
int max_flow = 0;
while (BFS(rG, V, s, d, parent)) {
int path_flow = INT_MAX;
for (v = d; v != s; v = parent[v])
{
u = parent[v];
path_flow = min(path_flow, rG[u][v]);
}
for (v = d; v != s; v = parent[v])
{
u = parent[v];
rG[u][v] -= path_flow;
rG[v][u] += path_flow;
}
max_flow += path_flow;
}
return max_flow;
}
int main() {
int V, e, x, y, c, i, max_flow = 0;
int** G;
f >> V >> e;
G = new int* [V];
for ( i = 0; i < V; i++)
G[i] = new int[V];
for (i = 0; i < e; i++) {
f >> x >> y >> c;
--x;
--y;
G[x][y] = c;
}
max_flow = Ford_Fulkerson(G, V, 0, V-1);
g << max_flow;
return 0;
}