Pagini recente » Cod sursa (job #2447148) | Cod sursa (job #784079) | Cod sursa (job #1039799) | Cod sursa (job #1052794) | Cod sursa (job #1598765)
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int MAX_N = 1010;
const int INF = 1000000000;
int c[MAX_N][MAX_N];
int f[MAX_N][MAX_N];
int n, m, S, D;
vector<int> A[MAX_N];
int h[MAX_N];
int e[MAX_N]; //excess
bool inq[MAX_N];
queue<int> Q;
void push(int s, int d) {
int val = min(c[s][d] - f[s][d], e[s]);
e[d] += val;
e[s] -= val;
f[s][d] += val;
f[d][s] -= val;
if(!inq[d]) {
Q.push(d);
inq[d] = true;
}
}
void relabel(int nod) {
int mm = 2 * n + 10;
for(int vecin : A[nod]) {
if(c[nod][vecin] > f[nod][vecin]) {
mm = min(mm, h[vecin]);
}
}
h[nod] = mm + 1;
}
void discharge(int nod) {
while(e[nod]) {
for(auto it = A[nod].begin(); it != A[nod].end() && e[nod]; it++) {
int vec = *it;
if(c[nod][vec] > f[nod][vec] && h[nod] > h[vec]) {
push(nod, vec);
}
}
if(e[nod]) {
relabel(nod);
}
}
}
int pushrelabel() {
S = 1;
D = n;
inq[S] = inq[D] = true;
h[S] = n;
e[S] = INF;
for(auto it = A[S].begin(); it != A[S].end(); it++) {
int vec = *it;
if(c[S][vec] > f[S][vec]) {
push(S, vec);
}
}
while(!Q.empty()) {
int nod = Q.front();
Q.pop();
inq[nod] = false;
discharge(nod);
}
return e[D];
}
int main() {
fin >> n >> m;
for(int i = 1; i <= m; i++) {
int a, b, cap;
fin >> a >> b >> cap;
A[a].push_back(b);
A[b].push_back(a);
c[a][b] = cap;
}
fout << pushrelabel();
}