Pagini recente » Istoria paginii runda/creanga10-12 | tema | Cod sursa (job #1786125) | Cod sursa (job #577011) | Cod sursa (job #2468888)
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
ifstream cin ("maxflow.in");
ofstream cout ("maxflow.out");
int n, m, x, y, z;
bool viz[1005];
int tata[1005];
int cap[1005][1005], res[1005][1005];
queue <int> q;
bool bfs(int src, int dst) {
q.push(src);
for(int i = 1; i <= n; i++)
viz[i] = 0;
viz[src] = 1;
while(!q.empty()) {
int nod = q.front();
q.pop();
for(int vec = 1; vec <= n; vec++) {
if(!viz[vec] && res[nod][vec] > 0) {
q.push(vec);
tata[vec] = nod;
viz[vec] = 1;
}
}
}
return viz[dst];
}
int maxflow(int src, int dst) {
int maxFlow = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++)
res[i][j] = cap[i][j];
}
while(bfs(src, dst)) {
int minFlow = 1e9, nod = dst;
while(nod != src) {
minFlow = min(minFlow, res[tata[nod]][nod]);
nod = tata[nod];
}
nod = dst;
while(nod != src) {
res[tata[nod]][nod] -= minFlow;
res[nod][tata[nod]] += minFlow;
nod = tata[nod];
}
maxFlow += minFlow;
}
return maxFlow;
}
int main() {
cin >> n >> m;
for(; m; m--) {
cin >> x >> y >> z;
cap[x][y] = z;
}
cout << maxflow(1, n);
return 0;
}