Pagini recente » Cod sursa (job #1160602) | Cod sursa (job #875659) | Cod sursa (job #2818141) | Cod sursa (job #3164040) | Cod sursa (job #2961013)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int Dinic(vector<vector<int> > &cap, int s, int t){
int n = cap.size();
vector<int> d(n), ptr(n);
int flow = 0;
while(true){
queue<int> q;
q.push(s);
fill(d.begin(), d.end(), -1);
d[s] = 0;
while(!q.empty()){
int v = q.front();
q.pop();
for(int i = 0; i < n; i++){
if(d[i] == -1 && cap[v][i] > 0){
q.push(i);
d[i] = d[v] + 1;
}
}
}
if(d[t] == -1)
break;
fill(ptr.begin(), ptr.end(), 0);
function<int(int, int)> dfs = [&](int v, int flow){
if(v == t)
return flow;
for(int &i = ptr[v]; i < n; i++){
if(d[i] == d[v] + 1 && cap[v][i] > 0){
int pushed = dfs(i, min(flow, cap[v][i]));
if(pushed > 0){
cap[v][i] -= pushed;
cap[i][v] += pushed;
return pushed;
}
}
}
return 0;
};
while(int pushed = dfs(s, INT_MAX))
flow += pushed;
}
return flow;
}
int main()
{
vector<vector<int>> cap;
int n, m;
fin >> n >> m;
cap.resize(n);
for (int i = 0; i < n; i++) {
cap[i].resize(n);
}
for (int i = 0; i < m; i++) {
int u, v, c;
fin >> u >> v >> c;
cap[u - 1][v - 1] = c;
}
fout << Dinic(cap, 0, n - 1) << endl;
return 0;
}