Pagini recente » Cod sursa (job #2904813) | Cod sursa (job #1467350) | Cod sursa (job #1362407) | Cod sursa (job #1606287) | Cod sursa (job #2888877)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int N = 1000, inf = 1e9;
vector <int> adj[N + 1];
int cap[N + 1][N + 1], flux[N + 1][N + 1], parent[N + 1], n, m;
bitset <N + 1> viz;
bool bfs(){
for(int i = 1; i <= n; i++)
parent[i] = 0;
viz.reset();
queue <int> q;
q.push(1);
viz[1] = 1;
while(!q.empty()){
int nod = q.front();
q.pop();
if(nod == n)
return true;
for(auto vec : adj[nod]){
if(!viz[vec] && cap[nod][vec] - flux[nod][vec] > 0){
parent[vec] = nod;
viz[vec] = 1;
q.push(vec);
}
}
}
return false;
}
int main(){
fin >> n >> m;
for(int i = 1; i <= m; i++){
int a, b, c;
fin >> a >> b >> c;
adj[a].push_back(b);
adj[b].push_back(a);
cap[a][b] = c;
}
int max_flow = 0;
while(bfs()){
for(auto vec : adj[n]){
if(cap[vec][n] - flux[vec][n] <= 0 || !viz[vec])
continue;
parent[n] = vec;
int mini = inf, nod = n;
while(nod != 1){
mini = min(mini, cap[parent[nod]][nod] - flux[parent[nod]][nod]);
nod = parent[nod];
}
if(mini == 0)
continue;
nod = n;
while(nod != 1){
flux[parent[nod]][nod] += mini;
flux[nod][parent[nod]] -= mini;
nod = parent[nod];
}
max_flow += mini;
}
}
fout << max_flow;
return 0;
}