Pagini recente » Cod sursa (job #321884) | Cod sursa (job #848530) | Cod sursa (job #966485) | Cod sursa (job #1391331) | Cod sursa (job #1397967)
#include<fstream>
#include<queue>
#include<vector>
#include<unordered_map>
#include<cstring>
using namespace std;
typedef int var;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
var mC = (1 << 17);
#define MAXN 1005
bool VIZ[MAXN];
var PARENT[MAXN];
queue<var> Q;
unordered_map<var, var> F[MAXN], C[MAXN];
vector<var> G[MAXN];
var S, D;
bool bfs(var m) {
memset(VIZ, 0, sizeof(VIZ));
PARENT[D] = 0;
VIZ[S] = 1;
Q.push(S);
while(!Q.empty()) {
var node = Q.front();
Q.pop();
for(auto vec : G[node]) {
if(C[node][vec] - F[node][vec] >= m && !VIZ[vec]) {
VIZ[vec] = 1;
PARENT[vec] = node;
Q.push(vec);
}
}
}
return PARENT[D] != 0;
}
var maxflow() {
var i;
var total = 0;
for(i=mC;i;i>>=1) {
while(bfs(i)) {
for(var node = D; node != S; node = PARENT[node]) {
F[PARENT[node]][node] += i;
F[node][PARENT[node]] -= i;
}
total += i;
}
}
return total;
}
int main() {
var n, m, a, b, c;
fin>>n>>m;
S = 1;
D = 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;
}