Pagini recente » Cod sursa (job #1244091) | Cod sursa (job #1191936) | Cod sursa (job #1377963) | Istoria paginii runda/ice_2 | Cod sursa (job #2208932)
//flux maxim
#include <iostream>
#include <fstream>
#include <queue>
#include <bitset>
#include <string.h>
#define NMAX 1005
#define inf 1 << 28
using namespace std;
int G[NMAX][NMAX], Gr[NMAX][NMAX], p[NMAX];
int N, M;
int bfs(int src, int dest){
bitset<NMAX> viz;
viz.reset();
queue<int> q;
memset(p, 0, sizeof(p));
q.push(src);
viz[src] = 1;
p[src] = -1;
while(!q.empty()){
int nod = q.front();
q.pop();
for(int j = 1; j <= M; ++j)
if(!viz[j] && Gr[nod][j] != 0){
q.push(j);
viz[j] = 1;
p[j] = nod;
}
}
return viz[dest] == 1;
}
int main(){
int x, y, c, i, maxfx = 0, fx;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
f >> N >> M;
for(int i = 1; i <= M; ++i){
f >> x >> y >> c;
G[x][y] = c;
Gr[x][y] = c;
}
while(bfs(1, N)){
i = N;
fx = inf;
while(i != 1){
fx = min(fx, Gr[p[i]][i]);
i = p[i];
}
i = N;
while(i != 1){
Gr[p[i]][i] -= fx;
Gr[i][p[i]] += fx;
i = p[i];
}
maxfx += fx;
}
g << maxfx << "\n";
return 0;
}