Pagini recente » Cod sursa (job #112756) | Cod sursa (job #1007395) | Cod sursa (job #59090) | Cod sursa (job #946135) | Cod sursa (job #1589283)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define DIM 1010
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int N,M,flux;
vector <int> v[DIM];
int C[DIM][DIM], F[DIM][DIM];
bitset <DIM> viz;
int T[DIM];
queue <int> Q;
int bfs(){
viz.reset();
Q.push(1);
viz[1] = 1;
while(!Q.empty()){
int node = Q.front();
Q.pop();
for(vector <int>::iterator it=v[node].begin();it!=v[node].end();it++){
if(!viz[*it] && F[node][*it] < C[node][*it]){
viz[*it] = 1;
T[*it] = node;
Q.push(*it);
}
}
}
return viz[N];
}
int main(){
fin >> N >> M;
while(M--){
int x,y,z;
fin >> x >> y >> z;
v[x].push_back(y);
v[y].push_back(x);
C[x][y] = z;
}
while(bfs())
for(vector <int>::iterator it=v[N].begin();it!=v[N].end();it++)
if(C[*it][N] > F[*it][N] && viz[*it]){
int minim = 0x3f3f3f3f;
int D = *it;
if(F[D][N] == C[D][N] || !viz[D])
continue;
T[N] = D;
while(T[D]!=0){
if(minim > C[T[D]][D] - F[T[D]][D])
minim = C[T[D]][D] - F[T[D]][D];
D=T[D];
}
if(minim==0)
continue;
D = N;
flux += minim;
while(T[D]!=0){
F[T[D]][D] += minim;
F[D][T[D]] -= minim;
D=T[D];
}
}
fout << flux << "\n";
}