Pagini recente » Cod sursa (job #349943) | Cod sursa (job #2706939) | Cod sursa (job #52199) | Cod sursa (job #2633701) | Cod sursa (job #2636809)
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include<cstring>
#define NMAX 1005
#define INF 100000000
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int G[NMAX][NMAX] = { 0 };
int n, m;
bool bfs(int G[][NMAX], int n, int source, int sink, int* parent,bool* viz) {
queue<int> q;
viz[source] = true;
parent[source] = -1;
q.push(source);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int v = 1;v <= n;++v)
if (!viz[v] && G[u][v] > 0) {
q.push(v);
parent[v] = u;
viz[v] = true;
}
}
return (viz[sink]==true);
}
void maximum_flow(int G[][NMAX], int n, int source, int sink) {
int g[NMAX][NMAX] = { 0 };
bool viz[NMAX] = { 0 };
for (int i = 1;i <= n;++i)
for (int j = 1;j <= n;++j)
if (G[i][j] > 0) {
g[i][j] = G[i][j];
}
int max_flow = 0;
int parent[NMAX];
while (bfs(g, n, source, sink, parent, viz)) {
for(int i=1;i<=n;++i)
if (g[i][sink] > 0 && viz[i]) {
int flow = INF;
for (int v = i;v != source;v = parent[v]) {
int u = parent[v];
if (g[u][v] < flow) flow = g[u][v];
}
for (int v = i;v != source;v = parent[v]) {
int u = parent[v];
g[u][v] -= flow;
g[v][u] += flow;
}
max_flow += flow;
}
memset(viz, false, sizeof(viz));
}
fout << max_flow << '\n';
}
int main() {
std::ios::sync_with_stdio(false);
fin >> n >> m;
while (m--) {
int x, y, c;
fin >> x >> y >> c;
G[x][y] = c;
}
maximum_flow(G, n, 1, n);
return 0;
}