Pagini recente » Cod sursa (job #3242072) | Cod sursa (job #2404377) | Cod sursa (job #562916) | Cod sursa (job #334801) | Cod sursa (job #2391559)
#include <bits/stdc++.h>
using namespace std;
#define N 805
int n, c[N][N], f[N][N];
struct node{
int h, eflow;
} ver[N];
int overflow(){
for (int i=1; i<=n; i++)
if (ver[i].eflow) return i;
return 0;
}
void preFlow(int s){
for (int i=1; i<=n; i++) ver[i] = {0, 0};
ver[s].h = n;
for (int i=1; i<=n; i++)
if (s != i && c[s][i]) ver[i].eflow = f[s][i] = c[s][i];
}
bool push(int q){
for (int i=1; i<=n; i++){
if (q == i || !c[q][i]) continue;
if (ver[q].h > ver[i].h){
int flow = min(c[q][i], ver[i].eflow);
ver[q].eflow -= flow;
ver[i].eflow += flow;
c[q][i] -= flow;
c[i][q] += flow;
return 1;
}
}
return 0;
}
void relabel(int q){
int mn = 1e9;
for (int i=1; i<=n; i++){
if (q == i || !c[q][i]) continue;
mn = min(mn, ver[i].h);
}
ver[q].h = mn + 1;
}
int maxFlow(int s, int t){
preFlow(s);
for (int u = overflow(); u; u = overflow())
if (!push(u)) relabel(u);
return ver[t].eflow;
}
int main(){
ifstream cin ("maxflow.in");
//ofstream cout ("maxflow.out");
cin >> n;
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++) cin >> c[i][j];
cout << maxFlow(1, n);
return 0;
}