Pagini recente » Cod sursa (job #1423287) | Cod sursa (job #2480705) | Cod sursa (job #454075) | Cod sursa (job #2845427) | Cod sursa (job #1970799)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1009;
const int oo = 1000000000;
int n , m , i;
class network
{
public :
int ok[nmax] , from[nmax];
int F[nmax][nmax] , C[nmax][nmax];
int MaxFlow , S , D;
queue < int > iq;
vector < int > graph[nmax];
int path()
{
memset(ok , 0 , sizeof(ok));
memset(from , 0 , sizeof(from));
while (iq.size()) iq.pop();
ok[S] = 1;
iq.push(S);
while (iq.size())
{
int act = iq.front();
iq.pop();
if (act == D) continue;
for (int i = 0 ; i < graph[act].size() ; ++i)
{
int fo = graph[act][i];
if (ok[fo]) continue;
if (F[act][fo] < C[act][fo])
{
from[fo] = act;
ok[fo] = 1;
iq.push(fo);
}
}
}
return ok[D];
}
void setSource(int x)
{
S = x;
}
void setDestination(int x)
{
D = x;
}
void addEdge(int x , int y , int z)
{
C[x][y] = z;
graph[x].push_back(y);
graph[y].push_back(x);
}
void process()
{
MaxFlow = 0;
while (path())
{
int Fact = oo;
for (int i = D ; i != S ; i = from[i])
Fact = min(Fact , C[from[i]][i] - F[from[i]][i]);
for (int i = D ; i != S ; i = from[i])
{
F[from[i]][i] += Fact;
F[i][from[i]] -= Fact;
}
MaxFlow += Fact;
}
}
} Solver;
int main()
{
freopen("maxflow.in" , "r" , stdin);
freopen("maxflow.out" , "w" , stdout);
scanf("%d" , &n);
scanf("%d" , &m);
Solver.setSource(1);
Solver.setDestination(n);
for (i = 1 ; i <= m ; ++i)
{
int x , y , z;
scanf("%d" , &x);
scanf("%d" , &y);
scanf("%d" , &z);
Solver.addEdge(x , y , z);
}
Solver.process();
printf("%d\n" , Solver.MaxFlow);
return 0;
}