Pagini recente » Cod sursa (job #2704323) | Cod sursa (job #2741534) | Cod sursa (job #188915) | Cod sursa (job #108867) | Cod sursa (job #1325796)
#include<fstream>
#include<vector>
#include<queue>
#define INF 1000001
#define MAXN 2001
using namespace std;
typedef int var;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
var F[MAXN][MAXN], C[MAXN][MAXN];
vector<var> G[MAXN];
bool VIZ[MAXN];
var PARENT[MAXN];
var st, ed, n;
queue<var> Q;
bool bfs() {
for(var i=1; i<=n; i++) {
VIZ[i] = 0;
PARENT[i] = 0;
}
Q.push(st);
VIZ[st] = 1;
while(!Q.empty()) {
var node = Q.front();
Q.pop();
for(vector<var>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
var vec = *it;
if(F[node][vec] < C[node][vec] && !VIZ[vec]) {
VIZ[vec] = 1;
PARENT[vec] = node;
Q.push(vec);
}
}
}
return VIZ[ed];
}
var maxflow() {
var flow = 0;
while(bfs()) {
for(vector<int>::iterator it = G[ed].begin(); it != G[ed].end(); ++it) {
var node = *it;
var MIN = C[node][ed] - F[node][ed];
while(PARENT[node]) {
MIN = min(MIN, C[PARENT[node]][node] - F[PARENT[node]][node]);
node = PARENT[node];
}
node = *it;
F[node][ed] += MIN;
F[ed][node] -= MIN;
while(PARENT[node]) {
F[PARENT[node]][node] += MIN;
F[node][PARENT[node]] -= MIN;
node = PARENT[node];
}
flow += MIN;
}
}
return flow;
}
int main() {
var m, a, b, c;
fin>>n>>m;
st = 1;
ed = n;
while(m--) {
fin>>a>>b>>c;
G[a].push_back(b);
G[b].push_back(a);
C[a][b] = c;
}
fout<<maxflow();
return 0;
}