Pagini recente » Cod sursa (job #2131065) | Cod sursa (job #1615159) | Cod sursa (job #1115506) | Cod sursa (job #726475) | Cod sursa (job #2824598)
#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 (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;
//cout<<minc<<": "<<g[nodc][i]<<" ";
while (aux != s) {
//cout<<aux<<" ";
cap[p[aux]][aux] -= minc;
cap[aux][p[aux]] += minc;
aux = p[aux];
}
ok = 1;
//cout<<"\n";
}
}
}
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;
}
while (flow(1, n)) {}
cout<<f;
return 0;
}