Pagini recente » Cod sursa (job #1393822) | Cod sursa (job #3284195) | Cod sursa (job #576378) | Cod sursa (job #2547317) | Cod sursa (job #1852705)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int Nmax = 1005;
int n, x, y, z, m, i;
class MaxFlow
{
vector<int> v[Nmax];
int t[Nmax], f[Nmax][Nmax], c[Nmax][Nmax];
bool bfs()
{
memset(t, -1, sizeof(t));
t[1] = 0;
queue<int> q;
q.push(1);
int node;
while(!q.empty())
{
node = q.front();
q.pop();
for(auto it : v[node])
if(t[it] == -1 && f[node][it] < c[node][it])
{
if(it==n) return 1;
q.push(it);
t[it] = node;
}
}
return 0;
}
public :
int max_flow()
{
int fmin, dad, node, ans=0;
while(bfs())
{
for(auto d : v[n])
if(t[d] != -1)
{
fmin = c[d][n] - f[d][n];
node = d;
while(node != 1)
{
dad = t[node];
fmin = min(c[dad][node] - f[dad][node], fmin);
node = dad;
}
ans += fmin;
f[d][n] += fmin;
f[n][d] -= fmin;
node = d;
while(node != 1)
{
dad = t[node];
f[dad][node] += fmin;
f[node][dad] -= fmin;
node = dad;
}
}
}
return ans;
}
void add_edge(int x, int y, int z)
{
c[x][y] = z;
v[x].push_back(y);
v[y].push_back(x);
}
} A;
int main()
{
fin >> n >> m;
for(i=1; i<=m; ++i)
{
fin >> x >> y >> z;
A.add_edge(x, y, z);
}
fout << A.max_flow() << '\n';
return 0;
}