Pagini recente » cnmnarad | Cod sursa (job #525441) | Cod sursa (job #2966952) | Cod sursa (job #519665) | Cod sursa (job #2383761)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define NMax 1010
#define MMax 5010
const int inf = (1 << 30) - 1;
int n, m;
int C[NMax][NMax], F[NMax][NMax];
vector<int> G[NMax];
int viz[NMax];
void citire();
void rezolvare();
bool bfs();
int main(){
citire();
rezolvare();
}
void citire(){
int i;
int x, y, z;
fin >> n >> m;
for(i = 0; i < m; i++){
fin >> x >> y >> z;
C[x][y] = z;
G[x].push_back(y);
G[y].push_back(x);
}
}
void rezolvare(){
int i, j, flux, fmin, x;
for(flux = 0; bfs();){
for(i = 0; i < G[n].size(); i++){
x = G[n][i];
if(!viz[x] || C[x][n] == F[x][n]) continue;
viz[n] = x;
fmin = inf;
for(x = n; x != 1; x = viz[x])
fmin = min(fmin, C[viz[x]][x] - F[viz[x]][x]);
if(fmin == 0) continue;
for(x = n; x != 1; x = viz[x]){
F[viz[x]][x] += fmin;
F[x][viz[x]] -= fmin;
}
flux += fmin;
}
}
fout << flux;
}
bool bfs(){
int i, x;
queue<int> q;
for(i = 1; i <= n; i++) viz[i] = 0;
q.push(1);
viz[1] = 1;
while(q.size()){
x = q.front(); q.pop();
if(x == n) continue;
for(i = 0; i < G[x].size(); i++)
if(!viz[G[x][i]] && C[x][G[x][i]] > F[x][G[x][i]]){
viz[G[x][i]] = x;
q.push(G[x][i]);
}
}
return viz[n];
}