Pagini recente » Cod sursa (job #1203988) | Cod sursa (job #2870302) | Cod sursa (job #2357490) | Cod sursa (job #1243939) | Cod sursa (job #2328364)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int N_MAX = 1000, oo = 2e9;
int q[N_MAX + 5], use[N_MAX + 5], TT[N_MAX + 5];
int c[N_MAX + 5][N_MAX + 5], N, M, flow, F[N_MAX + 5][N_MAX + 5];
vector <int> G[N_MAX + 5];
void read(){
in >> N >> M;
for (int i = 1; i <= M; ++i){
int x, y, z; in >> x >> y >> z;
G[x].push_back(y);
G[y].push_back(x);
c[x][y] = z;
}
}
int bfs(){
for (int i = 1; i <= N; ++i)
use[i] = TT[i] = 0;
q[1] = q[0] = 1;
use[1] = 1;
for (int i = 1; i <= q[0]; ++i){
int node = q[i];
if (node == N) continue; ///in plus
for (int i = 0; i < (int)G[node].size(); ++i){
int vecin = G[node][i];
if (use[vecin] || c[node][vecin] == F[node][vecin]) continue;
TT[vecin] = node;
q[++q[0]] = vecin;
use[vecin] = 1;
///if (vecin == N) return 1; in minus
}
}
return use[N]; ///in plus
}
void print(){
out << flow << '\n';
}
int main(){
read();
while(bfs())
for (int i = 0; i < (int)G[N].size(); ++i){
TT[N] = G[N][i];
if (F[TT[N]][N] == c[TT[N]][N] || !use[TT[N]]) continue;
int Fmin = oo;
for (int i = N; i != 1; i = TT[i])
Fmin = min(Fmin, c[TT[i]][i] - F[TT[i]][i]);
for (int i = N; i != 1; i = TT[i]){
F[TT[i]][i] += Fmin;
F[i][TT[i]] -= Fmin;
}
flow += Fmin;
}
/*while(bfs()){
int Fmin = oo;
for (int i = N; i != 1; i = TT[i])
Fmin = min(Fmin, c[TT[i]][i] - F[TT[i]][i]);
for (int i = N; i != 1; i = TT[i]){
F[TT[i]][i] += Fmin;
F[i][TT[i]] -= Fmin;
}
flow += Fmin;
}*/
print();
return 0;
}
///flux maxim
///traseu, plan