Pagini recente » Cod sursa (job #2768561) | Cod sursa (job #1089625) | Cod sursa (job #882686) | Cod sursa (job #1115268) | Cod sursa (job #2824575)
#include<fstream>
#include<iostream>
#include<vector>
#include<cstring>
#include<unordered_map>
#include<algorithm>
#include<utility>
using namespace std;
int n,m,k,f,q[50000];
int p[50000];
unordered_map<int, unordered_map<int, int>> cap;
vector<int> g[50000];
bool viz[50000];
bool flow(int s, int d) {
memset(viz,0,sizeof(viz));
int l = 1, r = 1;
viz[s] = 1; q[1] = s; p[s] = s;
bool ok = 0;
while (l<=r) {
int nodc = q[l++];
for (int i=0; i<g[nodc].size(); ++i)
if (!viz[g[nodc][i]] && cap[nodc][g[nodc][i]] > 0) {
if (g[nodc][i] != d) {
viz[g[nodc][i]] = 1;
p[g[nodc][i]] = nodc;
q[++r] = g[nodc][i];
} else {
int minc = cap[nodc][g[nodc][i]];
int aux = nodc;
while (p[aux] != s) {
minc = min(minc, cap[p[aux]][aux]);
aux = p[aux];
}
f += minc;
cap[nodc][g[nodc][i]] -= minc;
cap[g[nodc][i]][nodc] += minc;
aux = nodc;
while (p[aux] != s) {
cap[p[aux]][aux] -= minc;
cap[aux][p[aux]] += minc;
aux = p[aux];
}
ok = 1;
}
}
}
return ok;
}
int main(){
//ifstream cin("/usr/local/google/home/catavlas/ClionProjects/cf_training/subsecvente.in");
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
cin>>n>>m;
for (int i=1; i<=m; ++i) {
int x, y, z;
cin>>x>>y>>z;
g[x].push_back(y);
g[y].push_back(x);
cap[x][y] = z;
cap[y][x] = 0;
}
while (flow(1, n)) {}
cout<<f;
return 0;
}