Pagini recente » Cod sursa (job #1291656) | Istoria paginii monthly-2012/runda-6/clasament | Istoria paginii preoni-2007/clasament/runda-2/9 | Istoria paginii runda/moisil2016-9/clasament | Cod sursa (job #2485874)
#include <bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector <int>v[1005];
int n,m,i,j,x,y,T[1005],Q[1005],p,u,C[1005][1005],F[1005][1005],cost;
bool bfs()
{
for(int i = 1; i <= n; ++i)
T[i] = -1;
T[1] = 0;
Q[1]=1;
p=u=1;
while(p<=u){
int Nod = Q[p];
p++;
for(auto i : v[Nod])
if(T[i] == -1 && C[Nod][i] > F[Nod][i]) {
T[i] = Nod;
if(i == n)
return 1;
Q[++u]=i;
}
}
return 0;
}
int MaxFlow() {
int ans = 0;
while(bfs()) {
for(auto i : v[n])
if(T[i] != -1) {
int r = C[i][n] - F[i][n];
int Nod = i, x = 0;
while(Nod != 1){
x = T[Nod];
r = min(r, C[x][Nod] - F[x][Nod]);
Nod = x;
}
ans += r; F[i][n] += r; F[n][i] -= r;
Nod = i;
while(Nod != 1){
x = T[Nod];
F[x][Nod] += r;
F[Nod][x] -= r;
Nod = x;
}
}
}
return ans;
}
int main()
{
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y>>cost;
C[x][y]=cost;
v[x].push_back(y);
v[y].push_back(x);
}
g<<MaxFlow();
return 0;
}