Pagini recente » Cod sursa (job #854987) | Cod sursa (job #2226344) | Cod sursa (job #1781552) | Cod sursa (job #2561567) | Cod sursa (job #2236046)
//Edmons-Karp
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int NMAX = 1005;
struct Edge {
int to;
int cap;
int flow;
int rev;
};
vector<Edge> g[NMAX];
int n, m, src, dest, cap[NMAX][NMAX];
void addedge(int i, int j) {
Edge a = {j, cap[i][j], 0, g[j].size()};
Edge b = {i, cap[j][i], 0, g[i].size()};
g[i].push_back(a);
g[j].push_back(b);
// cout << i << " " << j << endl;
}
bool visited[NMAX];
int dfs(int from, int deltaflow) {
visited[from] = 1;
if(from == dest)
return deltaflow;
for(auto &it : g[from]) {
if(it.flow < it.cap && !visited[it.to]) {
int addflow = dfs(it.to, min(deltaflow, it.cap - it.flow));
if(addflow) {
it.flow += addflow;
Edge &rev = g[it.to][it.rev];
rev.flow -= addflow;
return addflow;
}
}
}
return 0;
}
int main() {
in >> n >> m;
for(int i = 1; i <= m; i ++) {
int x, y, c;
in >> x >> y >> c;
cap[x][y] = c;
}
for(int i = 1; i <= n; i ++)
for(int j = i + 1; j <= n; j ++)
if(cap[i][j] || cap[j][i])
addedge(i, j);
src = 1;
dest = n;
int maxflow = 0, aux = dfs(src, INT_MAX);
while(aux) {
for(int i = 1; i <= n; i ++)
visited[i] = 0;
maxflow += aux;
aux = dfs(src, INT_MAX);
}
out << maxflow;
return 0;
}