Pagini recente » Cod sursa (job #1995366) | Cod sursa (job #1070869) | Cod sursa (job #2590146) | Cod sursa (job #2563440) | Cod sursa (job #2579569)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int INF = 0x3f3f3f3f;
int cap[1041][1041];
int flo[1041][1041];
vector<int> gra[1041];
int n, m;
void read(){
fin >> n >> m;
for(int i = 0; i < m; ++i){
int a, b, v;
fin >> a >> b >> v;
cap[a][b] = v;
gra[a].push_back(b);
gra[b].push_back(a);
}
}
int dad[1041];
bitset<1041> vi;
queue<int> qu;
bool bfs(){
vi.reset();
qu.push(1);
vi[1] = true;
while(!qu.empty()){
int a = qu.front();
qu.pop();
for(auto b : gra[a]){
if(vi[b] || cap[a][b] == flo[a][b])continue;
dad[b] = a;
vi[b] = true;
if(b != n)qu.push(b);
}
}
return vi[n];
}
int flow = 0;
void solve(){
while(bfs()){
for(auto a : gra[n]){
if(!vi[a] || cap[a][n] == flo[a][n])continue;
int fmin = INF;
dad[n] = a;
for(int x = n; x > 1; x = dad[x]){
fmin = min(fmin, cap[dad[x]][x] - flo[dad[x]][x]);
}
if(fmin == 0)continue;
for(int x = n; x > 1; x = dad[x]){
flo[dad[x]][x] += fmin;
flo[x][dad[x]] -= fmin;
}
flow += fmin;
}
}
}
int main(){
read();
solve();
fout << flow;
return 0;
}