Pagini recente » Cod sursa (job #3195871) | Cod sursa (job #76976) | bkt2_oct2011 | Cod sursa (job #1227852) | Cod sursa (job #1700719)
#include <fstream>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N = 1001, inf = 0x3f3f3f3f;
vector<int> graph[N]; //bidirectional
int cap[N][N], diff[N][N], T[N], n;
bool bfs(int x, int D){
memset(T, -1, sizeof(T));
queue<int> Q;
Q.push(x);
while ( !Q.empty() ){
x = Q.front();
Q.pop();
for ( int y : graph[x] )
if ( diff[x][y] && T[y] == -1 ){
T[y] = x;
Q.push(y);
}
}
return T[D] != -1;
}
inline int getFlow(int x, int y){
return cap[x][y] - diff[x][y];
}
int maxflow(int S, int D){
memcpy( diff, cap, sizeof(cap) );
int tot = 0;
while ( bfs(S, D) ) for (int d : graph[D]) {
int F = inf; T[D] = d;
for (int i = D; i != S; i = T[i])
F = min( F, diff[ T[i] ][i] );
for (int i = D; i != S; i = T[i]){
diff[ T[i] ][i] -= F;
diff[i][ T[i] ] += F;
}
tot += F;
}
return tot; //actual flow(x, y) = cap[x][y] - flow[x][y];
}
int main(){
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int m, x, y;
in >> n >> m;
while (m--){
in >> x >> y;
in >> cap[x][y];
graph[x].push_back(y);
graph[y].push_back(x);
}
out << maxflow(1, n) << '\n';
return 0;
}