Pagini recente » Cod sursa (job #2770122) | Cod sursa (job #150099) | Cod sursa (job #2043095) | Cod sursa (job #1834298) | Cod sursa (job #2698478)
#include <fstream>
#include <queue>
#include <algorithm>
#include <bitset>
using namespace std;
int const N = 1e3 + 3, M = 5e3 + 3;
int v [2 * N] , vf [2 * N] , nxt [2 * N] , sz , C [2 * N] , RV [2 * N];
ifstream f ("maxflow.in");
ofstream g ("maxflow.out");
int t [N] , index [N][N] , indexR [N][N];
bool viz [N];
void add (int a , int b , int c){
vf [++ sz] = b;
if (c)
C [sz] = c;
else
RV [sz] = 0;
nxt [sz] = v [a];
v [a] = sz;
}
int maxflow (int n , int m){
int r = 0;
queue <int> q;
bool p = true;
while (p){
q . push (1);
viz [1] = true;
p = false;
int flow = 0;
while (q . size () && ! p){
int x = q . front ();
for(int i = v [x] ; i && ! p ; i = nxt [i]){
int y = vf [i];
if (! viz [y] && y == n && C [i]){
p = true;
t [n] = x;
}
if (! viz [y] && C [i]){
q . push (y);
viz [y] = true;
t [y] = x;
}
if (! viz [y] && RV [i]){
q . push (y);
viz [y] = true;
t [y] = x;
}
}
q . pop ();
}
while (q . size ())
q . pop ();
if (p == false)
return r;
int node = n;
while (t [node]){
int curr;
if (index [t [node]][node])
curr = C [index [t [node]][node]];
else
curr = RV [indexR [t [node]][node]];
if (node == n)
flow = curr;
else
flow = min (flow , curr);
node = t [node];
}
r += flow;
node = n;
while (t [node]){
int a = index [t [node]][node];
int b = indexR [node][t [node]];
C [a] -= flow;
RV [b] += flow;
node = t [node];
}
for(int i = 1 ; i <= n ; ++ i)
viz [i] = false;
fill (t + 1 , t + 1 + n , 0);
}
}
int main()
{
int n , m;
f >> n >> m;
for(int i = 1 ; i <= m ; ++ i){
int a , b , c;
f >> a >> b >> c;
add (a , b , c);
index [a][b] = sz;
add (b , a , 0);
indexR [b][a] = sz;
}
g << maxflow (n , m);
return 0;
}