Pagini recente » Cod sursa (job #1659966) | Cod sursa (job #178749) | Cod sursa (job #1307871) | Cod sursa (job #2882854) | Cod sursa (job #1497163)
#include <iostream>
#include <fstream>
#include <queue>
#include <set>
#define MAXN 1000
#define MAXVAL 9999999
using namespace std;
typedef pair <int, int> pere;
typedef queue <pere> coada;
int pre[MAXN + 1];
int z[MAXN + 1][MAXN + 1], z1[MAXN + 1][MAXN + 1];
coada Q;
int n, m, drum, minv;
inline int min(int x, int y) {
return x < y ? x : y;
}
void bfs(int source) {
pre[source] = 0;
Q.push(make_pair(source, MAXVAL));
while (!Q.empty() && !drum) {
pere node = Q.front();
Q.pop();
if (node.first == n) {
drum = 1;
minv = node.second;
}
else {
for (int i = 1 ; i <= n ; ++i)
if (i != node.first && i != source && !pre[i]) {
if (z[node.first][i] > 0) {
pre[i] = node.first;
Q.push(make_pair(i, min(node.second, z[node.first][i])));
}
else if (z1[node.first][i] > 0) {
pre[i] = node.first;
Q.push(make_pair(i, min(node.second, z1[node.first][i])));
}
}
}
}
}
int main () {
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
cin >> n >> m;
for (int i = 0 ; i < m ; ++i) {
int x, y, zz;
cin >> x >> y >> zz;
z[x][y] = zz;
}
int maxflow = 0;
do {
drum = 0;
for (int i = 1 ; i <= n ; ++i)
pre[i] = 0;
minv = MAXVAL;
bfs(1);
if (drum) {
maxflow += minv;
int node = n;
while (pre[node]) {
if (z[pre[node]][node] > 0) {
z[pre[node]][node] -= minv;
z1[node][pre[node]] += minv;
}
else {
z1[pre[node]][node] -= minv;
}
node = pre[node];
}
}
} while(drum);
cout << maxflow << "\n";
return 0;
}