Pagini recente » Cod sursa (job #1322721) | Cod sursa (job #1204125) | Cod sursa (job #631126) | Cod sursa (job #94108) | Cod sursa (job #2961692)
#include <bits/stdc++.h>
#define oo 1e9
int n;
using namespace std;
int Dinic(vector<vector<int>> &cap, int s, int t){
vector<int> level(n), ptr(n);
function<bool(int)> bfs = [&](int s){
level.assign(n, -1);
level[s] = 0;
queue<int> q;
q.push(s);
while(!q.empty()){
int u = q.front();
q.pop();
for(int v = 0; v < n; v++){
if(level[v] == -1 && cap[u][v] > 0){
level[v] = level[u] + 1;
q.push(v);
}
}
}
return level[t] != -1;
};
function<int(int, int)> dfs = [&](int u, int flow){
if(u == t) return flow;
for(int &v = ptr[u]; v < n; v++){
if(level[v] == level[u] + 1 && cap[u][v] > 0){
int pushed = dfs(v, min(flow, cap[u][v]));
if(pushed > 0){
cap[u][v] -= pushed;
cap[v][u] += pushed;
return pushed;
}
}
}
return 0;
};
int flow = 0;
while(bfs(s)){
ptr.assign(n, 0);
while(int pushed = dfs(s, oo)){
flow += pushed;
}
}
return flow;
}
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int main() {
int m;
fin >> n >> m;
vector<vector<int>> muchie(n, vector<int>(n));
for(int i = 0; i < m; i++){
int x, y, c;
fin >> x >> y >> c;
x--; y--;
muchie[x][y] += c;
}
fout<<Dinic(muchie, 0, n-1);
return 0;
}