Pagini recente » Cod sursa (job #2445672) | Cod sursa (job #1487192) | Cod sursa (job #3282566) | Cod sursa (job #2215600) | Cod sursa (job #2950468)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
const int MAX_N = 1002;
class FLOW {
public:
int src, dest;
int N;
int F[MAX_N][MAX_N], p[MAX_N], viz[MAX_N];
vector<int>G[MAX_N];
FLOW (int n, int s = -1, int d = -1) {
if (n > MAX_N) {
cout << "FA MAX_N MAI MARE!!!";
}
else {
N = n;
src = s;
dest = d;
for (int i = 1; i <= n; i++) {
for (auto it : G[i])
F[i][it] = F[it][i] = 0;
G[i].clear();
}
}
}
void add_edge (int a, int b, int e) {
G[a].push_back(b);
G[b].push_back(a);
F[a][b] = e;
}
bool bfs () {
for (int i = 1; i <= N; i++)
viz[i] = p[i] = 0;
queue<int>q;
viz[src] = 1;
q.push(src);
while (q.front()) {
int nod = q.front();
q.pop();
if (nod == dest)
return 1;
for (auto it : G[nod]) {
if (!viz[it] && F[nod][it]) {
viz[it] = 1;
p[it] = nod;
q.push(it);
}
}
}
return 0;
}
int maxFlow() {
int flow = 0;
while (bfs()) {
for (auto x : G[dest]) {
if (viz[x] && F[x][dest]){
p[dest] = x;
int fmin = F[x][dest];
for (int node = dest; node != src; node = p[node])
fmin = min(fmin, F[p[node]][node]);
for (int node = dest; node != src; node = p[node]) {
F[p[node]][node] -= fmin;
F[node][p[node]] += fmin;
}
flow += fmin;
}
}
}
return flow;
}
};
int n, m;
int main ()
{
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
fin >> n >> m;
FLOW flux(n, 1, n);
for (int i = 1; i <= m; i++) {
int a, b, c;
cin >> a >> b >> c;
flux.add_edge(a, b, c);
}
fout << flux.maxFlow();
return 0;
}